HomeDev GuideAPI Reference
Dev GuideAPI ReferenceUser GuideGitHubNuGetDev CommunitySubmit a ticketLog In
GitHubNuGetDev CommunitySubmit a ticket

Content Metadata properties

Describes metadata interfaces and metadata properties that you can define on content models.

EPiServer.Core.IContentData is the base interface that all content models implement. All content types, except BlockData, also implement the EPiServer.Core.IContent interface is required for a content instance to have a unique ID and its own lifecycle (that is, it can be loaded or saved individually). Through the EPiServer.IContentRepository, you can perform CRUD (Create, Read, Update, Delete) operations on content instances implementing EPiServer.Core.IContent, for example, listing and move.

There are also many additional metadata interfaces a content type can implement that define the characteristics of the content type. Here is a list of the existing metadata interfaces with a description of the purpose of each interface and which properties they contain.


Because some of the interfaces are optional, a recommended pattern when working with a "general" IContent instance is to use the is or as operators to check if the instance implements an interface, as in this example:

public static CultureInfo Language(this IContent content) {
  if (content == null) throw new ArgumentNullException(nameof(content));
  return (content is ILocale locale) ? locale.Language : CultureInfo.InvariantCulture;

public static bool IsModified(this IContent content) {
  if (content == null) throw new ArgumentNullException(nameof(content));
  var modifiedTrackable = content as IModifiedTrackable;
  return modifiedTrackable == null || modifiedTrackable.IsModified;

Shared blocks

BlockData does not implement IContent, while shared block instances still have their own identity defined on IContent. This is accomplished so that during runtime, when a shared block instance is created (for example, through a call to IContentRepository.GetDefault<T> where T is a type inheriting from BlockData), the Optimizely Content Management System (CMS) creates a .NET type inheriting T using a technique called mixin where the newly generated subclass will implement some extra interfaces (including IContent).

That means that a shared block instance of T will implement IContent while an instance of T that is a property on a Page will not.


Base interface for content models. It contains a backing PropertyDataCollection that is used when loading or saving data from the database.

Property PropertyDataCollectionContains backing data for properties used by the content instance.


Base interface for all content models that can have an own identity, and hence can be loaded/saved individually. IContent inherits IContentData. Note that ContentLink.ID and ContentGuid is the same for all language branches for a content item. So the combination of ContentLink/ContentGuid and ILocale.Language uniquely specifies the content instance (given that the content implements ILocalizable). All built-in base content types, except BlockData, implement IContent. Shared block instances implement IContent (and most other metadata interfaces) at runtime.

Name stringThe name of the content instance.
ContentLinkContentReferenceThe identifier of the content instance. WorkID specifies an optional version ID, in case the instance represents a specific version.
ContentGuidGuidA GUID-based identifier for the content instance.
ParentLinkContentReferenceThe parent identifier (in a tree structure) for the content instance.
ContentTypeIDintAn identifier that specifies which content type the content is an instance of.
IsDeletedboolIndicates if the content instance is in the wastebasket.
Property PropertyDataCollectionInherited from IContentData.


An optional interface for content that supports different versions for each language branch. There can only be one version published at most at a time. Built-in types, except ContentFolder, implement IVersionable. See Content versions.

Status VersionStatusSpecifies the status of the content version.
IsPendingPublishboolSpecifies if there is any published version for the current language branch.
StartPublishDateTime?Optional value that specifies when the content is/was published.
StopPublishDateTime?Optional value that specifies when the content is/was depublished.


An optional interface for content that specifies which language a specific content instance has. All built-in types except ContentFolder implements ILocale.

Language CultureInfoSpecifies the language of a content instance. CultureInfo.InvariantCulture means that the content instance is not culture-specific.


An optional interface for content that support multiple language branches. Inherits ILocale. All built-in types, except ContentFolder and MediaData, implement ILocalizable.

Language CultureInfoInherits from ILocale.
MasterLanguageCultureInfoSpecifies which language version contains the non-language-specific properties.
ExistingLanguagesIEnumerableSpecifies all existing language branches for this content.


An optional interface for content that support read-only instances. It is highly recommended that content types implement IReadOnly, which ensures the integrity of the content instances when instances are served from the cache and hence reused across different requests. All built-in base content classes implement IReadOnly.

IsReadOnlyboolSpecifies if the current instance is read-only.
void MakeReadOnly()MethodMakes an instance read-only.
object/T CreateWritableClone()MethodCreates a writable clone from a read-only instance.


An optional interface for content instances that support modified tracking. There is a high-performance gain during save operations with IModifiedTrackable because then only data that has changed needs to be persisted. Built-in base content classes implement IModifiedTrackable.

IsModifiedboolSpecifies if the current instance is modified.
void ResetModified()MethodSets the content instance in a non-modified state.


An optional interface for content instances that support tracking of changes. All built-in base content classes implement IChangeTrackable.

IsModifiedboolSpecifies if the current instance is modified.
void ResetModified()MethodSets the content instance in a non-modified state.


An optional interface for content instances that support access checks. All built-in base content classes implement IContentSecurable.

IContentSecurityDescriptor GetContentSecurityDescriptor()MethodGets the security descriptor for the content instance where access rights can be checked.


An interface that content items that should be routable through a content URL should be implemented. All built-in base content classes, except shared blocks, implement IRoutable.

RouteSegmentstringSpecifies the route segment used in the hierarchical content URL for the content instance.


An interface with content items that you could categorize should be implemented. Built-in base content classes, except content folders, implement ICategorizable.

CategoryCategoryListA list of all categories that this content instance is categorized as.


An optional interface for content items you can implement should be added when you create an instance of the content type.

void SetDefaultValues(ContentType contentType)MethodCalled when an instance of the content type is created.


An optional interface specifies how a content instance should be handled during export.

ShouldBeImplicitlyExportedboolSpecifies whether this instance should be implicitly added to the export package when referenced by some exported entity.