Bartosz Sekula
Sep 28, 2021
  4632
(2 votes)

How to resolve current content context

With the release of CMS UI 11.36.2 it is now possible to resolve the current loaded content context from anywhere you may need.

It might be useful if you need 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)
    {

    }
}

You might also need to know the current context in metadata aware components, like for example in this Editor Descriptor:

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
        // https://world.optimizely.com/forum/developer-forum/CMS/Thread-Container/2016/1/current-content-for-propertylist-item-selection-factory/
        // and
        // https://world.optimizely.com/forum/developer-forum/CMS/Thread-Container/2021/9/tinymce-customization-depending-on-page-context/
        var currentContent = _currentContent.ContentLink; // --> will return correct page id
    }
}

Related forum posts that describe the problem:

https://world.optimizely.com/forum/developer-forum/CMS/Thread-Container/2021/9/tinymce-customization-depending-on-page-context/

https://world.optimizely.com/forum/developer-forum/CMS/Thread-Container/2020/12/get-value-of-contextepi-cms-contentdata/#234848

https://world.optimizely.com/forum/developer-forum/CMS/Thread-Container/2016/1/current-content-for-propertylist-item-selection-factory/

Sep 28, 2021

Comments

Tomas Hensrud Gulla
Tomas Hensrud Gulla Sep 28, 2021 11:54 AM

Will there be release notes describing this?

Bartosz Sekula
Bartosz Sekula Sep 28, 2021 11:55 AM

Yes, documentation is scheduled to be published. It will be available soon.

Tomas Hensrud Gulla
Tomas Hensrud Gulla Sep 28, 2021 11:59 AM

Excellent work, by the way. Thanks! :-)

Ravindra S. Rathore
Ravindra S. Rathore Sep 30, 2021 07:11 AM

👍

Please login to comment.
Latest blogs
CI/CD deployment failure in Optimizely DXP Passportal. .NET 10 and GitHub Runner Compatibility

.NET 10 and GitHub Runner Compatibility With the release of .NET 10, the windows-latest and ubuntu-latest GitHub Actions runners may use the latest...

owaiskhan | Jun 16, 2026

Integrating Optimizely CMP Assets into an Existing Document Listing Page

Integrating Optimizely CMP Assets into an Existing Document Listing Page In some projects, there may be a requirement to retrieve assets from...

owaiskhan | Jun 16, 2026

Setting up Opti Id SSO with and without SCIM

This blog compiled learnings, when setting up Opti Id for large enterprises using SCIM and its pros and cons when setting up Opti Id without SCIM....

Muhammad Talha | Jun 16, 2026

Understanding Optimizely Opal Cost vs Value

Every Opal conversation seems to start with the same question: "What does it cost?" Fair, but it's only half the question. Cost tells you what you'...

K Khan | Jun 15, 2026

Leverage — The CMS Edits One Item at a Time. The Work Doesn't.

Editorial work arrives in batches — a product rename across two hundred support articles, five hundred FAQs that should become blocks, an SEO refre...

Allan Thraen | Jun 15, 2026 |

“Learning by Doing – Optimizely OPAL Series” | Episode 02 is Live!

Introduction With Optimizely OPAL, we’re not just generating content—we’re designing intelligent workflows. But after working with teams and...

Ratish | Jun 14, 2026 |