我正在使用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文件夹有自己的文档类型,但内容模块有几种不同的文档类型。
答案 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)
}
}