【发布时间】:2016-10-18 10:13:46
【问题描述】:
我在 Umbraco 中有一个设置,我希望一些不同的文档类型对编辑器具有层级关系。因此,我将文档类型 A 配置为允许文档类型 B 的“子代”。我还将文档类型 B 配置为允许文档类型 C 的“子代”。
在视图的列表中,我想显示所有共享 A 类型特定祖先的 C 类型文档(即,此处 B 类型的直接父级无关)。我在控制器中使用了类似这样的代码:
var rootChildren = Umbraco?.TypedContent(RootId)?.Children;
var items = rootChildren
.SelectMany(rc => rc?.Children?
.Where(c => c != null
&& c.GetPropertyValue<Boolean>(FieldNames.SomeValue)));
var viewModels = allItems.Select(p => new SomeViewModel
{
// Object initialization code
});
return viewModels.ToArray();
RootId 的值是从 ConfigurationSection 读取的,因此可以针对不同的环境进行更改或不相等。
我觉得一个缺点是我的代码与我为后台编辑器设置的细节纠缠在一起。我想我可以通过使用像IEnumerable<IPublishedContent>.DescendantsOrSelf(SomeDocumentTypeAlias) 这样的“软”选择方法来部分解决这个问题。 (我认为在使用任何 CMS 时,与文档类型相关联是一种照常业务的麻烦。)
然而,像DescendantOrSelf 这样的“软”选择方法并不能解决使用哪个节点作为起点的问题。因为站点根目录中可以有任意数量的 A 类内容,所以我不能按文档类型来分类。
此外,由于 Umbraco 的节点 ID 似乎不可预测,在开发人员和其他环境之间共享内容,我对基于配置的解决方案并不完全满意,因为从版本控制的角度来看它并不完美。
虽然我相当精通 ASP.NET MVC 等,但我对 Umbraco 的最佳实践知之甚少,所以这就是我要问的;作为经验丰富的 Umbraco 开发人员,您将如何实施这样的事情?
【问题讨论】: