在Razor中从两个电话中列出一个列表

在Razor中从两个电话中列出一个列表,razor,umbraco,umbraco7,Razor,Umbraco,Umbraco7,我正在使用Razor在Umbraco创建一个简单的站点 我有一个页面,其中可能包括几个内容模块,应该在页面上输出。页面也可能有子页面–当然,这些子页面不应该输出到页面上,这些页面上的内容也不应该输出。为了使编辑器更方便,可以将模块分组到页面下的可选模块文件夹中。因此,结构是: –我的页面 –内容1 ––模块文件夹 ––内容2 –子页面 ––内容3 因此,页面My page应该列出内容1和内容2,而忽略子页面及其decentant 只需创建两个列表CurrentPage.Children和Curr

我正在使用Razor在Umbraco创建一个简单的站点

我有一个页面,其中可能包括几个内容模块,应该在页面上输出。页面也可能有子页面–当然,这些子页面不应该输出到页面上,这些页面上的内容也不应该输出。为了使编辑器更方便,可以将模块分组到页面下的可选模块文件夹中。因此,结构是:

–我的页面 –内容1 ––模块文件夹 ––内容2 –子页面 ––内容3

因此,页面My page应该列出内容1和内容2,而忽略子页面及其decentant

只需创建两个列表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();
这非常有效–但是,模块文件夹是可选的。当它不存在时,页面上根本不会输出任何内容。可能是因为无法声明ModuleInfo文件夹。如果我切换这两个,它告诉我ModuleNoPage不包含“Concat”的定义

我尝试了一些不同的方法,比如计算元素的数量,然后根据结果对“moduleList”进行不同的定义,但没有效果。我还尝试使用一个调用,只列出所有子页面的子页面,但也列出了任何子页面的内容——除非我可以将某些内容传递给subjects方法

我怎样才能优雅地解决这个问题


只有一种页面类型,模块文件夹有自己的文档类型,但内容模块有几种不同的文档类型。

我提出了以下示例,也许可以为您指出一个好的方向。我不清楚收集的对象是否是您最终想要的。下面的示例将接受传递给视图的父节点,然后将属性值写入页面。我试着做了一些例子,比如如何处理要忽略的事情,以及对于文档类型可能有不同逻辑的情况。我希望这能为你的问题提供一些指导

@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)
    }
}