Resolve the currently loaded content context
Describes using an instance of CurrentContentContext object to resolve the currently loaded content context.
To resolve the current loaded content context, get an instance of CurrentContentContext
object. You should 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
}
}
Updated 6 months ago