如何检查当前文档类型的祖先是否是 Umbraco 中的特定类型
本文关键字:类型 是否是 祖先 Umbraco 文档 何检查 检查 | 更新日期: 2023-09-27 18:32:23
我正在尝试编写一些适用于Umbraco中一组文档类型中的任何页面的逻辑。
我想说"这个文档的类型,或者它的任何父文档类型是否等于某种类型",但我甚至无法弄清楚如何进入文档类型结构。
我尝试将"HasProperty"与父级上定义的属性一起使用以达到相同的效果(因为属性是继承的) - 但如果该属性没有值,则 HasProperty 返回 False(这对我来说似乎很糟糕,但显然就是它的工作原理)。
在 Umbraco v6.1.5(程序集版本:1.0.4993.19246)中使用 Razor。
(现在我必须检查 NodeTypeAlias 是否在一个大列表中)。
您无法从已发布的缓存(即从Node
或IPublishedContent
对象)检索DocumentType
层次结构。
但是,您可以做的是:
-
在应用程序启动时,生成所有内容(不是媒体、成员)
DocumentType
对象的Collection<DocumentType>
对象并缓存它。我当然不会从 UI 执行此操作,因为查询 DocumentType 会导致对数据库的调用,因此缓存和重用对象要好得多。 -
可能将相同的代码添加到
DocumentType
的 AfterNew 事件中。这样,新的DocumentType
对象也会添加到缓存列表中。 -
创建一个扩展方法,如查询缓存列表的现有
IsDocumentType(string documentTypeAlias)
。
下面的代码将检索父结构,你只需要添加一个while(docType.MasterContentType != null)
结构:
DocumentType docType = DocumentType.GetByAlias("ContentPage");
DocumentType parentDocType = new DocumentType(docType.MasterContentType);`
编辑:
如果您想深入了解在IPublishedContent
或Node
实例上拥有属性的根源,那么我将采用类似的方法。
让所有文档类型继承自具有名为
parentDocTypeAliases
的标签属性的单个文档类型。在
Document
的Newing
事件中,将父文档类型的别名作为 cmma 分隔的列表添加到parentDocTypeAliases
属性中。您仍然需要上面列出的代码来查询文档类型层次结构。创建新的扩展方法(例如
InheritsFromDocumentType(string documentTypeAlias)
),用于查询 CSV 值。
您可以使用以下内容执行"此文档的类型,或其任何父文档类型是否等于某种类型":
node.AncestorsOrSelf().FirstOrDefault(x => x.DocumentTypeAlias == "your doctype alias");
这将返回它遇到的第一个节点的 IPublishedContent 对象,类型为"您的文档类型别名"。
来源: http://our.umbraco.org/documentation/Reference/Mvc/querying