2

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

我想说'此文档的类型,还是它的任何父文档类型等于某种类型',但我什至无法弄清楚如何进入文档类型结构。

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

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

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

4

2 回答 2

1

您不能DocumentType从已发布的缓存中检索层次结构,即从NodeorIPublishedContent对象中。

但是,您可以做的是:

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

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

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

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

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

编辑:

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

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

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

  3. 创建一个InheritsFromDocumentType(string documentTypeAlias)查询 csv 值的新扩展方法(例如)。

于 2013-09-24T08:08:03.110 回答
1

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

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

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

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

于 2013-10-14T09:30:52.620 回答