【问题标题】:How do I check if any of the current document type's ancestors are a specific type in Umbraco?如何检查当前文档类型的任何祖先是否是 Umbraco 中的特定类型?
【发布时间】:2013-09-28 15:35:06
【问题描述】:

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

我想说“这个文档的类型,或者它的任何父文档类型是否等于某种类型”,但我什至不知道如何进入文档类型结构。

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

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

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

【问题讨论】:

  • 即使是属性中的默认值也可以。然后在我的父母身上,我可以拥有一个对所有孩子都适用的属性——但我认为你不能在 Umbraco 中指定默认值?

标签: c# asp.net razor umbraco


【解决方案1】:

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

但是,你可以做的是:

  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. 创建一个查询 csv 值的新扩展方法(例如InheritsFromDocumentType(string documentTypeAlias))。

【讨论】:

  • 非常感谢您的回答 - 但与仅检查文档类型列表相比,维护开销似乎更多。我真的很惊讶“HasProperty”检查的是“真实”值而不是它是否已定义——因为这似乎是一个完美、简单的解决方案。
  • 我已经更新了我的答案。无论您是否拥有属性或查询文档类型的静态列表,都是六和二三,但我可以看到在属性中拥有它的优势。
  • 对不起,我的意思是使用普通属性:不使用父文档类型设置属性。因为属性是从父文档类型继承的,所以我要做的只是检查文档是否具有属性。但我不能,因为新文档的默认设置是所有对 HasProperty 的检查都返回 false。显然,有些包可以让我为某些文档类型的属性设置默认值 - 也许这就是要走的路。
  • 抱歉什么是“正常”属性?您的问题是专门询问任何文档“是此文档的类型,还是它的任何父文档类型等于某种类型”。我不确定您为什么使用HasProperty(),因为这与问题无关。我的解决方案是一种完全有效的方法,而且也只有几行代码。
  • 我并不是说您的解决方案不是解决问题的方法。文档类型包含一组属性。这些都是遗传给他们的孩子。因此,另一种检查文档是否为某种类型的方法是检查它的属性——这些属性是继承的,因此完全符合我想要的方式。无需在页面之外编写任何代码。但您无法检查它们是否存在。
【解决方案2】:

您可以使用以下命令“是此文档的类型,还是它的任何父文档类型等于某种类型”:

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

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

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

【讨论】:

  • 这将获得树中具有指定类型的第一个节点。不是第一个具有该类型或其任何父类型的类型。这就是我一直在寻找的。我正在寻找查询文档类型层次结构,而不是内容层次结构(我可以这样做:))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-09
  • 2010-09-23
  • 2020-06-07
  • 1970-01-01
  • 2023-02-16
相关资源
最近更新 更多