2013-09-23 43 views
2

我想寫一些適用於Umbraco中任何一組文檔類型的頁面的邏輯。如何檢查當前文檔類型的祖先是否是Umbraco中的特定類型?

我想說的是'這個文檔的類型,或者它的任何父類文檔類型等於某個類型',但是我不知道如何獲得文檔類型結構。

我嘗試使用'HasProperty'與父級上定義的屬性來實現相同的效果(因爲屬性被繼承) - 但如果該屬性沒有值,則HasProperty返回False(這似乎打破我,但顯然它是如何工作的)。

在Umbraco v6.1.5中使用Razor(程序集版本:1.0.4993.19246)。 (現在我將不得不檢查NodeTypeAlias是否在大列表中,我想)。

+0

即使在一個屬性將做一個默認值。然後在我的父母身上,我可以擁有一個對所有孩子都是真實的屬性 - 但我不認爲你可以在Umbraco中指定默認值? –

回答

1

您不能檢索從公佈的緩存,即從NodeIPublishedContent對象DocumentType層次。

不過,你可以做的是:

  1. 在應用程序啓動產生的所有內容Collection<DocumentType>對象(而不是媒體,成員)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 label屬性的單一文檔類型繼承。

  2. DocumentNewing事件中,將父文檔類型的別名作爲cmma分隔列表添加到parentDocTypeAliases屬性。您仍然需要上面列出的代碼來查詢文檔類型層次結構。

  3. 創建查詢CSV值的新的擴展方法(例如InheritsFromDocumentType(string documentTypeAlias))。

+0

非常感謝答案 - 但與僅僅檢查文檔類型列表相比,維護開銷似乎更大。我真的很驚訝'HasProperty'檢查'真正'的價值,而不是定義 - 因爲這看起來像一個完美的,簡單的解決方案。 –

+0

我已經更新了我的答案。無論你是否擁有一個屬性或詢問一個靜態的文檔類型列表,它都是6和2,但我可以看到它在屬性中的優勢。 – Digbyswift

+0

對不起,我的意思是使用正常的屬性:沒有設置父級文檔類型的屬性。因爲屬性是從父文檔類型繼承的,所以我想要做的只是檢查一個文檔是否有屬性。但我不能,因爲新文檔的默認值是所有檢查HasProperty的返回false。顯然有一些軟件包可以讓我爲某些文檔類型的屬性設置一個默認值 - 也許這是要走的路。 –

0

你可以做「是這個文件的類型,或者它的父文件類型等於某一類型」改爲:

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

這將返回第一個節點的IPublishedContent對象它會遇到類型「你的文檔類型別名」。

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

+0

這將得到具有指定類型的樹中的第一個節點。不是具有該類型或其父類型的第一個類型。這是我正在尋找的。我期待查詢文檔類型層次結構,而不是內容層次結構(我可以這樣做:)) –

相關問題