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

时间:2013-09-23 16:29:35

标签: c# asp.net razor umbraco

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

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

我尝试使用'HasProperty'和父类定义的属性来实现相同的效果(因为属性是继承的) - 但是如果属性没有值,那么HasProperty返回False(这似乎对我不利) ,但显然它是如何工作的。)

在Umbraco v6.1.5中使用Razor(汇编版本:1.0.4993.19246)。

(现在我必须检查NodeTypeAlias是否在我认为的大清单中。)

2 个答案:

答案 0 :(得分:1)

您无法从已发布的缓存中检索DocumentType层次结构,即从NodeIPublishedContent对象中检索。{/ p>

但是,你能做的是:

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

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

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

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

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

    修改

    如果你想在IPublishedContentNode实例上找到属性的根,那么我会采用类似的方法。

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

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

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

答案 1 :(得分:0)

你可以做'是这个文档的类型,或者它的任何父类文档类型等于某种类型',具有以下内容:

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

这将返回遇到类型为“your doctype alias”的第一个节点的IPublishedContent对象。

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