Loading...
Area: Optimizely CMS
Applies to versions: 11.36.2 and higher

Resolving Current Content Context

Recommended reading 

To resolve the current loaded content context, get an instance of CurrentContentContext object.

It might be useful to run any custom logic in any of the Content Events:

[ModuleDependency(typeof(EPiServer.Shell.UI.InitializationModule))]
public class CustomModule : IConfigurableModule
{
    public void Initialize(InitializationEngine context)
    {
        context.Locate.ContentEvents().CreatedContent += CreatedContent;
        context.Locate.ContentEvents().CreatingContent += CreatingContent;
    }

    private void CreatingContent(object sender, ContentEventArgs e)
    {   
        var currentContentContext = ServiceLocator.Current.GetInstance<CurrentContentContext>();
        // we know which content context initiated the CREATE operation        
        var currentContentLink = currentContentContext.ContentLink;

        var newlyCreatedContentLink = e.ContentLink; // --> null as at this point the ContentReference was not assigned yet
    }

    private void CreatedContent(object sender, ContentEventArgs e)
    {
        var newlyCreatedContentLink = e.ContentLink; // this is the ContentReference of the newly created content item
        // but we might need the ContentReference of the content that was being viewed when the CREATE operation was run
        var currentContentContext = ServiceLocator.Current.GetInstance<CurrentContentContext>();
        // this gives us the content context the editor was in
        var currentContentLink = currentContentContext.ContentLink;
    }

    public void Uninitialize(InitializationEngine context)
    {
        context.Locate.ContentEvents().CreatedContent -= CreatedContent;
        context.Locate.ContentEvents().CreatingContent -= CreatingContent;
    }

    public void ConfigureContainer(ServiceConfigurationContext context)
    {

    }
}

It also might be useful to know the current content context in any metadata-aware component such as  an EditorDescriptor, for example.

public class FooPageType : PageData 
{
    [EditorDescriptor(EditorDescriptorType = typeof(CollectionEditorDescriptor<OfferDetailsItem>))]
    public virtual IList<OfferDetailsItem> OfferDetailsItems { get; set; }
}

public class OfferDetailsItem
{
    [Display(Order = 1)]
    [UIHint("test")]
    public string Label { get; set; }
}

[PropertyDefinitionTypePlugIn]
public class OfferDetailsItemPropertyList : PropertyList<OfferDetailsItem>
{
}

[EditorDescriptorRegistration(TargetType = typeof(string), UIHint = "test")]
public class CustomXhtmlDescriptor : StringEditorDescriptor
{
    private readonly CurrentContentContext _currentContent;

    public CustomXhtmlDescriptor(CurrentContentContext currentContent)
    {
        _currentContent = currentContent;
    }

    public override void ModifyMetadata(ExtendedMetadata metadata, IEnumerable<Attribute> attributes)
    {
        base.ModifyMetadata(metadata, attributes);

        var ownerContent = metadata.FindOwnerContent(); // --> will return null because the object we annotate is not ContentData but simple POCO
        var currentContent = _currentContent.ContentLink; // --> will return correct page id
    }
}

Related forum posts that describe the problem:

Do you find this information helpful? Please log in to provide feedback.

Last updated: Oct 08, 2021

Recommended reading