EPiServer 9: EPiServer ContentArea 内容是否有真正的替代品?

EPiServer 9: Is there any real alternative for EPiServer ContentArea Contents?

我是EPiServer的初学者。我们使用 EPiServer 版本 9.12。 EPiServer.Core.ContentArea 过去有一个目录列表,现在已过时,请参阅:http://world.episerver.com/documentation/Class-library/?documentId=cms/7.5/284B326A

image http://jweschenfelder.de/download/Untitled.png

Contents 列表在过去的优势在于您可以读取块的名称,因为它读取了 ContentArea 的全部内容。检索名称会很棒,因为如果您在 CMS 中创建新块,则可以在 CMS 中配置它。如果我改用现在建议的 Items 集合,我将无法读取包含 Link items 集合的块的名称,我只能读取块内的 Link items 集合那么

我看过这个例子:
IContentLoader contentLoader = ServiceLocator.Current.GetInstance< IContentLoader >(); OnSiteLinkBlock itemBlock = contentLoader.Get(item.ContentLink, new LoaderOptions() { LanguageLoaderOption.MasterLanguage() });
我可以编辑 OnSiteLinkBlock,但其他属性仍然为空,并且未由 EPiServer 的 ContentLoader 填充(IContentLoader 是 EPiServer 的接口)。

有关 class 层次结构的更多信息:
- [AvailableContentTypes(Availability = Availability.None)]<br/> public class BlockData : ContentData, IReadOnly< BlockData >, IReadOnly(在EPiServer.Core)
- public abstract class BlockBase : BlockData(BlockBase 是自己的class)
- public class OnSiteLinkBlock : BlockBase(OnSiteLink块是自己的class)

有人知道这里的解决方案吗?如何读取 ContentArea 的更多属性?或者是否存在 ContentArea 的替代方案?非常感谢!

通常使用 ItemsFilteredItems 属性从 ContentAreas 读取内容。他们 return 可枚举 ContentAreaItem 个。

使用 IContentLoader 解析 IContent 实例并用 ContentLink

提供它
var loader = ServiceLocator.Current.GetInstance<IContentLoader>();

// contentarea is called UpperArea in the example
var icontentItems = currentPage.UpperArea
                         .FilteredItems
                         .Select(x => loader.Get<IContent>(x.ContentLink));

// example render in razor
foreach (var icontentItem in icontentItems)
{
    <h2>@icontentItem.Name</h2>
}

针对您关于 ContentAreas 替代方案的问题,答案是肯定的。基本上有三种添加 block/page 类型列表的方法,每种方法各有利弊:

- LinkItemCollection
- IList<ContentReference>
- ContentArea

这是一本关于它们主要区别的好书:https://gregwiechec.com/2015/09/comparing-list-properties/