就个人而言,我不喜欢使用常量文件。如果您的客户或您的一位开发人员删除其中一项并创建一个新项,会发生什么? Sitecore 的基本原则之一是可以由不一定是“技术”人员的用户添加和删除项目。
Sitecore 提供“插入选项”,以便您可以指定可以将哪些类型的项目添加到每个文件夹中,并通过角色和用户权限授予保护某些项目不被删除的能力。这在概念上意味着什么?这意味着 Sitecore 的设置使得系统架构师/开发人员可以创建一个不会被违反的结构,而内容编辑器可以在该结构中添加或删除内容。换句话说,Sitecore 旨在提供一个框架,其中项目可以更改,但每种类型的项目的位置都是预先确定的。
因此,我建议您使用 Sitecore Marketplace 中提供的 Custom Item Generator 模块(免费)。 CIG 生成模板的 C# 类表示(模型),并将所有字段变成属性(我不想离题太远,但这是 CIG 的一个很棒的功能,尤其是在与新开发人员合作时)。您可以将自己的方法添加到 CIG 类中以获取特定类型的子级。例如,在个人资料页面是主页的直接子级的站点上,可以将以下方法添加到 CIG HomepageItem.instance.cs 文件的 HomepageItem 部分类:
...
public partial class HomepageItem
{
public ProfilePageItem GetProfilePage()
{
//note that .IsOfType(...) is pseudo-code and not a real method, but I do
// suggest that you define an extension for it
return InnerItem.Children.FirstOrDefault(i => i.IsOfType(ProfilePageItem.TemplateId));
}
}
确保您分配插入选项以限制可以作为子项添加到您制作的每个项目的项目类型(将它们添加到标准值而不是单个内容项)。我还建议您为内容树中使用的每个文件夹创建一个从 Common/Folder 继承的单独模板。这样您就可以在整个结构中使用 CIG,方法是:
...in your Globals Item's CIG class...
public partial class GlobalsItem
{
public SlidesFolderItem GetSlidesFolder()
{
return InnerItem.Children.FirstOrDefault(i => i.IsOfType(SlidesFolderItem.TemplateId));
}
}
...in your Slides Folder Item's CIG class...
public partial class SlidesFolderItem
{
public IEnumerable<SlideItem> GetSlides()
{
return InnerItem.Children.Where(i => i.IsOfType(SlideItem.TemplateId));
}
}
然后您可以通过以下方式获取您的幻灯片项目:
...
var slidesFolder = globals.GetSlidesFolder();
var slides = slidesFolder != null ? slidesFolder.GetSlides() : null;
请记住,每种类型的文件夹的 CIG、插入选项和模板将使您能够为您的网站创建一个坚固的结构,即使内容编辑器进行了意外更改(例如替换项目)也不会破坏。
如果您对此有任何疑问,请告诉我。祝你好运,快乐编码! :)