我正在尝试编写一些适用于Umbraco中任何一组文档类型的页面的逻辑。
我想说'这个文档的类型,或者它的任何父文档类型都等于某种类型',但我无法弄清楚如何进入文档类型结构。
我尝试使用'HasProperty'和父类定义的属性来实现相同的效果(因为属性是继承的) - 但是如果属性没有值,那么HasProperty返回False(这似乎对我不利) ,但显然它是如何工作的。)
在Umbraco v6.1.5中使用Razor(汇编版本:1.0.4993.19246)。
(现在我必须检查NodeTypeAlias是否在我认为的大清单中。)
答案 0 :(得分:1)
您无法从已发布的缓存中检索DocumentType
层次结构,即从Node
或IPublishedContent
对象中检索。{/ p>
但是,你能做的是:
在应用程序启动时,生成所有内容(不是媒体,成员)Collection<DocumentType>
对象的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
的标签属性的doc类型继承。
在Newing
的{{1}}事件中,将父文档类型的别名添加为cmma分隔列表到Document
属性。您仍然需要上面列出的代码来查询文档类型层次结构。
创建一个查询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