如何在foreach循环中列出儿童的孩子?

时间:2015-07-06 22:22:03

标签: razor foreach umbraco nodes

所以,我在这里要做的是动态创建一个列表,并在每个列表项中有一个嵌套列表。为了更容易想象,我特别要做的是列出年份(子节点),然后列出那些年的月份(节点的子节点),以便组织日志。

到目前为止,我所拥有的代码列出了多年......但我不确定如何为子节点的子节点做些什么。我是否必须调用一个新变量,或者有没有办法通过基本上告诉它“好了,现在列出你刚刚展示的孩子的孩子”?

不确定它是否重要,但这是在Umbraco模板中。

<ul>
    @{
        var LogsNode = Model.Content.AncestorOrSelf("LogsLanding");
    }
    @foreach (var node in LogsNode.Children.Where("Visible"))
    {
        <li>
            <h2>@node.AsDynamic().Name</h2>
            <ul>
                <li>
                    CHILDREN OF LISTED NODE HERE
                </li>
            </ul>
        </li>
    }
</ul>

1 个答案:

答案 0 :(得分:2)

您需要将一些逻辑提取到辅助方法中,这样您就可以从内部调用它,每次都传递一个新的父级。

在Umbraco中,您可以使用/适应您自己的需求。一个这样的模板应该为你解决这个问题(或者至少演示如何实现)是SiteMap模板,如下所示:

@inherits umbraco.MacroEngines.DynamicNodeContext

@* Render the sitemap by passing the root node to the traverse helper *@
<div class="sitemap">
    @traverse(@Model.AncestorOrSelf())
</div>

@* Helper method to travers through all descendants *@
@helper traverse(dynamic node)
{

    @* If a MaxLevelForSitemap parameter is passed to the macro, otherwise default to 4 levels *@
    var maxLevelForSitemap = String.IsNullOrEmpty(Parameter.MaxLevelForSitemap) ? 4 : int.Parse(Parameter.MaxLevelForSitemap);

    @* Select visible children *@
    var items = node.Children.Where("Visible").Where("Level <= " + maxLevelForSitemap);


    @* If any items are returned, render a list *@
    if (items.Any())
    {
        <ul>
            @foreach (var item in items)
            {
                <li class="level-@item.Level">
                    <a href="@item.Url">@item.Name</a>

                    @*Run the traverse helper again *@
                    @traverse(item)
                </li>
            }
        </ul>
    }
}