如何检查当前文档类型的祖先是否是 Umbraco 中的特定类型

本文关键字:类型 是否是 祖先 Umbraco 文档 何检查 检查 | 更新日期: 2023-09-27 18:32:23

我正在尝试编写一些适用于Umbraco中一组文档类型中的任何页面的逻辑。

我想说"这个文档的类型,或者它的任何父文档类型是否等于某种类型",但我甚至无法弄清楚如何进入文档类型结构。

我尝试将"HasProperty"与父级上定义的属性一起使用以达到相同的效果(因为属性是继承的) - 但如果该属性没有值,则 HasProperty 返回 False(这对我来说似乎很糟糕,但显然就是它的工作原理)。

在 Umbraco v6.1.5(程序集版本:1.0.4993.19246)中使用 Razor。

(现在我必须检查 NodeTypeAlias 是否在一个大列表中)。

如何检查当前文档类型的祖先是否是 Umbraco 中的特定类型

您无法从已发布的缓存(即从NodeIPublishedContent对象)检索DocumentType层次结构。

但是,您可以做的是:

  1. 在应用程序启动时,生成所有内容(不是媒体、成员)DocumentType对象的Collection<DocumentType>对象并缓存它。我当然不会从 UI 执行此操作,因为查询 DocumentType 会导致对数据库的调用,因此缓存和重用对象要好得多。

  2. 可能将相同的代码添加到DocumentType的 AfterNew 事件中。这样,新的DocumentType对象也会添加到缓存列表中。

  3. 创建一个扩展方法,如查询缓存列表的现有IsDocumentType(string documentTypeAlias)

下面的代码将检索父结构,你只需要添加一个while(docType.MasterContentType != null)结构:

DocumentType docType = DocumentType.GetByAlias("ContentPage");
DocumentType parentDocType = new DocumentType(docType.MasterContentType);`

编辑:

如果您想深入了解在IPublishedContentNode实例上拥有属性的根源,那么我将采用类似的方法。

  1. 让所有文档类型继承自具有名为 parentDocTypeAliases 的标签属性的单个文档类型。

  2. DocumentNewing 事件中,将父文档类型的别名作为 cmma 分隔的列表添加到 parentDocTypeAliases 属性中。您仍然需要上面列出的代码来查询文档类型层次结构。

  3. 创建新的扩展方法(例如 InheritsFromDocumentType(string documentTypeAlias) ),用于查询 CSV 值。

您可以使用以下内容执行"此文档的类型,或其任何父文档类型是否等于某种类型":

node.AncestorsOrSelf().FirstOrDefault(x => x.DocumentTypeAlias == "your doctype alias");

这将返回它遇到的第一个节点的 IPublishedContent 对象,类型为"您的文档类型别名"。

来源: http://our.umbraco.org/documentation/Reference/Mvc/querying