Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何检查当前文档类型';s的祖先是翁布拉科的一种特殊类型?_C#_Asp.net_Razor_Umbraco - Fatal编程技术网

C# 如何检查当前文档类型';s的祖先是翁布拉科的一种特殊类型?

C# 如何检查当前文档类型';s的祖先是翁布拉科的一种特殊类型?,c#,asp.net,razor,umbraco,C#,Asp.net,Razor,Umbraco,我试图编写一些逻辑,适用于Umbraco中任何一组文档类型的页面 我想说‘这个文档的类型,或者它的任何父文档类型是否等于某个类型’,但我甚至无法确定如何进入文档类型结构 我尝试将“HasProperty”与父级上定义的属性一起使用,以实现相同的效果(因为属性是继承的)-但是如果属性没有值,则HasProperty返回False(在我看来这似乎是错误的,但显然这就是它的工作方式) 使用Umbraco v6.1.5(装配版本:1.0.4993.19246)中的剃须刀 (现在我必须检查NodeType

我试图编写一些逻辑,适用于Umbraco中任何一组文档类型的页面

我想说‘这个文档的类型,或者它的任何父文档类型是否等于某个类型’,但我甚至无法确定如何进入文档类型结构

我尝试将“HasProperty”与父级上定义的属性一起使用,以实现相同的效果(因为属性是继承的)-但是如果属性没有值,则HasProperty返回False(在我看来这似乎是错误的,但显然这就是它的工作方式)

使用Umbraco v6.1.5(装配版本:1.0.4993.19246)中的剃须刀


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

您无法从发布的缓存中检索
文档类型
层次结构,即从
节点
IPublishedContent
对象

但是,您可以做的是:

  • 在应用程序启动时,生成所有内容(不是媒体、成员)
    DocumentType
    对象的
    集合
    对象,并将其缓存。我当然不会在UI上这样做,因为查询DocumentType会导致对数据库的调用,所以缓存和重用对象要好得多

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

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

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

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

    如果您想深入了解
    IPublishedContent
    节点
    实例上的属性,那么我将采用类似的方法

  • 使所有文档类型都继承自一个具有名为
    parentDocTypeAlias
    的标签属性的文档类型

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

  • 创建查询csv值的新扩展方法(例如,
    InheritsFromDocumentType(string documentTypeAlias)


  • 您可以使用以下命令执行“此文档的类型或其任何父文档类型是否等于某个类型”:

    node.AncestorsOrSelf().FirstOrDefault(x => x.DocumentTypeAlias == "your doctype alias");
    
    这将返回它遇到的第一个节点的类型为“your doctype alias”的IPPublishedContent对象


    来源:

    非常感谢您的回答,但与仅检查文档类型列表相比,这方面的维护开销似乎更大。我真的很惊讶“HasProperty”检查的是“true”值,而不是它是否已定义,因为这似乎是一个完美、简单的解决方案。我已经更新了我的答案。它是6和2 3,是你是否有一个属性还是询问一个文档类型的静态列表,但我可以看到在属性中有它的好处。对不起,我只是说使用一个普通属性:不要设置一个与父文档类型相关的属性。因为属性是从父文档类型继承的,所以我要做的只是检查文档是否有属性。但我不能,因为新文档的默认设置是所有HasProperty检查都返回false。显然,有一些软件包可以让我为某些文档类型的属性设置默认值——也许这就是方法。对不起,什么是“普通”属性?您的问题是专门询问任何文档“此文档的类型或其任何父文档类型是否等于某个类型”。我不确定您为什么要使用
    HasProperty()
    ,因为这与问题无关。我的解决方案是一种非常有效的方法,而且只需要几行代码。我并不是说你的解决方案不是解决问题的方法。文档类型包含一组属性。这些都是遗传给他们的孩子的。因此,检查文档是否为特定类型的另一种方法是检查它的属性——这些属性是继承的,因此以我想要的方式完全匹配。无需在页面外编写任何代码。但是你不能检查它们的存在,即使是属性中的默认值也可以。然后,在我的父节点上,我可以拥有一个对所有子节点都为真的属性-但我不认为您可以在Umbraco?中指定默认值,这将获得树中第一个指定类型的节点。不是第一个具有该类型或其任何父类型的。这就是我要找的。我希望查询文档类型层次结构,而不是内容层次结构(我可以做到:))