处理Umbraco中的父/子内容关系



我在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,那就很可能是"设置后就忘了它"的情况,但是如果要使用多个列表,编辑器很容易自己选择父节点。

相关内容

  • 没有找到相关文章

最新更新