2014-11-05 64 views
0

我使用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文件夾具有自己的文檔類型,但內容模塊有幾種不同的文檔類型。

回答

0

我想出了下面的例子,或許可以爲你指出一個好的方向。我不清楚是否收集的對象是你最終想要或不想要的。以下示例將接受傳遞給View的父節點,然後將屬性值寫入頁面。我試圖做一些例子,比如要做什麼來忽略事情,以及您可能對文檔類型有不同邏輯的情況。我希望這給你一些關於你的問題的指導。

@using umbraco.NodeFactory 
@model Node 
@{ 
    // For sake of example, we can state that Model is the My Page node you have 
} 
@foreach (var item in Model.GetChildNodes()) 
{ 
    // So lets go through all items that you mentioned 
    @RenderSection(item) 
} 
@helper RenderSection(Node node) 
{ 
    if (node.NodeTypeAlias != "Page") 
    { 
     // Pages don't get rendered 
     return; 
    } 

    if (node.NodeTypeAlias == "Module") 
    { 
     @Html.Raw(node.GetProperty("TitleOfModule")) 
    } 

    // Output the content 
    @Html.Raw(node.GetProperty("BodyContent")) 

    // If you call render section again on the child nodes you can nest this structure to do things like if needed. Not sure 
    //– My Page 
    //––– Content 1 
    //––– Module folder 
    //––– ––– Content 2 
    //––– ––– ––– Module folder 
    //––– ––– ––– ––– Content 3 
    //––– Subpage 
    //––– ––– Content 3 
    foreach (var subItem in node.GetChildNodes()) 
    { 
     @RenderSection(subItem) 
    } 
}