在 Umbraco 中处理 Parent/Child 内容关系
Dealing with Parent/Child Content Relationships in Umbraco
我在 Umbraco 中有一个设置,我希望一些不同的文档类型与编辑器具有层次结构关系。因此,我将文档类型 A 配置为允许文档类型 B 的 "children"。我还配置文档类型 B 以允许文档类型 C 的 "children"。
在视图的列表中,我想显示共享类型 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)
这样的 "soft" 选择方法来部分解决这个问题。 (我想在使用任何 CMS 时,受制于文档类型是一种常见的麻烦。)
"soft"选择方法如DescendantOrSelf
然而并没有解决以哪个节点为起点的问题。因为站点根目录中可以有任意数量的 A 类内容,所以我无法通过文档类型来判断。
此外,由于 Umbraco 似乎无法预测节点 ID,在开发人员和其他环境之间共享内容,我对基于配置的解决方案并不完全满意,因为从版本控制的角度来看它并不完美。
虽然相当精通 ASP.NET MVC 等,但我对 Umbraco 的最佳实践还不是很了解,所以这就是我要问的;作为经验丰富的 Umbraco 开发人员,您将如何着手实现这样的东西?
不完全确定我明白为什么这是个问题,但是这里是...抱歉,如果我误解了什么:-/
AFAIK,你应该能够从类似这样的查询中得到你想要的东西:
Umbraco?.TypedContent(ParentId)?.Descendants().OfTypes("yourDocType")
关于配置(如何最好地获取 RootId),您可以在根节点文档类型(或与要显示的列表相关的其他地方)上创建节点选择器 属性,从而 select 用作 "root"/parent.
的节点
这样,如果开发人员共享数据库,节点 ID 将被设置并正常工作,并且当您部署代码时,每个环境都将通过 backend/database.
设置自己的 ID
如果每个站点只设置一个节点id,那是很"set it and forget it"的场景,但如果要使用多个列表,编辑器很容易select父节点他们自己。
我在 Umbraco 中有一个设置,我希望一些不同的文档类型与编辑器具有层次结构关系。因此,我将文档类型 A 配置为允许文档类型 B 的 "children"。我还配置文档类型 B 以允许文档类型 C 的 "children"。
在视图的列表中,我想显示共享类型 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)
这样的 "soft" 选择方法来部分解决这个问题。 (我想在使用任何 CMS 时,受制于文档类型是一种常见的麻烦。)
"soft"选择方法如DescendantOrSelf
然而并没有解决以哪个节点为起点的问题。因为站点根目录中可以有任意数量的 A 类内容,所以我无法通过文档类型来判断。
此外,由于 Umbraco 似乎无法预测节点 ID,在开发人员和其他环境之间共享内容,我对基于配置的解决方案并不完全满意,因为从版本控制的角度来看它并不完美。
虽然相当精通 ASP.NET MVC 等,但我对 Umbraco 的最佳实践还不是很了解,所以这就是我要问的;作为经验丰富的 Umbraco 开发人员,您将如何着手实现这样的东西?
不完全确定我明白为什么这是个问题,但是这里是...抱歉,如果我误解了什么:-/
AFAIK,你应该能够从类似这样的查询中得到你想要的东西:
Umbraco?.TypedContent(ParentId)?.Descendants().OfTypes("yourDocType")
关于配置(如何最好地获取 RootId),您可以在根节点文档类型(或与要显示的列表相关的其他地方)上创建节点选择器 属性,从而 select 用作 "root"/parent.
的节点这样,如果开发人员共享数据库,节点 ID 将被设置并正常工作,并且当您部署代码时,每个环境都将通过 backend/database.
设置自己的 ID如果每个站点只设置一个节点id,那是很"set it and forget it"的场景,但如果要使用多个列表,编辑器很容易select父节点他们自己。