我在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类内容,所以我不能按照文档类型来查找。
而且,因为节点id在Umbraco中似乎不可预测,在开发人员和其他环境之间共享内容,我对基于配置的解决方案并不完全满意,因为从版本控制的角度来看,它并不完美。
虽然相当精通ASP。NET MVC等,我对Umbraco的最佳实践了解不多,所以这就是我要问的;作为一名经验丰富的《Umbraco》开发者,你会如何执行这样的内容?
我不完全确定为什么这是一个问题,但这里是…如果我误解了什么,很抱歉:-/
我敢说,你应该能够从这样的查询中得到你想要的东西:
Umbraco?.TypedContent(ParentId)?.Descendants().OfTypes("yourDocType")
关于配置(如何最好地获得RootId),您可以在根节点doctype(或与显示列表的位置相关的其他地方)上创建节点选择器属性,从而选择要用作"根"/父节点的节点。
这样,如果开发人员共享数据库,节点id将被设置并工作,当您部署代码时,每个环境将通过后端/数据库设置自己的id。
如果每个站点只设置一个节点id,那就很可能是"设置后就忘了它"的情况,但是如果要使用多个列表,编辑器很容易自己选择父节点。