我使用Razor在Umbraco中創建了一個簡單的網站。從剃刀中的兩個調用中創建一個列表
我有一個頁面,其中可能包含幾個內容「模塊」,應該在頁面上輸出。該頁面也可能有子頁面 - 這些頁面當然不會輸出在頁面上,這些頁面上的內容也不應該輸出。爲了使編輯更容易,可以將模塊組合在頁面下的可選「模塊」文件夾中。該結構是這樣的:
- 我的網頁
---內容1
---模塊夾
--- ---內容2
---子頁面
--- ---內容3
頁面「我的頁面」因此應該列出「內容1」和「內容2」,而忽略「子頁面」及其後代。
這是通過創建兩個列表(CurrentPage.Children和CurrentPage.Modules.Children)然後連接它們簡單地完成,因爲這樣的:
// Retrieve all modules in subfolder "modules" ...
var modulesInFolder = CurrentPage.Modules.First().Children.Where("NodeTypeAlias != \"Page\"");
// Retrieve all modules found directly on page ... (i.e. child nodes except pages)
var modulesOnPage = CurrentPage.Children.Where("NodeTypeAlias != \"Page\"");
// Concatenate the two lists, so we can loop through them
var moduleList = modulesInFolder.Concat(modulesOnPage).ToList();
這個偉大的工程 - 然而,「模塊」文件夾可選的。當它不存在時,頁面上根本沒有輸出。大概是因爲「modulesInFolder」不能被聲明。如果我切換這兩個,它會告訴我「modulesOnPage不包含Concat的定義」。
我已經嘗試了一些不同的東西,比如計算元素的數量,然後根據結果不同地定義'moduleList',但無濟於事。我也嘗試過使用一個調用,並簡單地列出所有Descendants()
,但也列出了任何子頁面的內容 - 除非我可以將某些內容傳遞給Descendants()
方法?
如何優雅地解決這個問題?
只有一種頁面類型,並且modules文件夾具有自己的文檔類型,但內容模塊有幾種不同的文檔類型。