在Razor的两个调用中创建一个列表

时间:2014-11-05 14:32:09

标签: razor umbraco umbraco7

我正在使用Razor在Umbraco中创建一个简单的网站。

我有一个页面,其中可能包含多个内容" modules&#34 ;,应该在页面上输出。页面也可能有子页面 - 当然不应该在页面上输出,这些页面上的内容也不应该输出。为了使编辑器更容易,模块可以组合在一个可选的"模块"页面下的文件夹。因此结构是:

- 我的页面 ---内容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文件夹有自己的文档类型,但内容模块有几种不同的文档类型。

1 个答案:

答案 0 :(得分: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)
    }
}