如何在 foreach 循环中列出子项的子项?

How do I list children of children in a foreach loop?

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

到目前为止,我这里的代码可以列出年份...但我不确定要为子节点的子节点做什么。我是否必须调用一个新变量,或者有没有办法通过本质上告诉它 "okay, now list the children of the child you just displayed"?

不确定它是否重要,但这在 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>

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

在 Umbraco 中有一些模板,您可以 use/adapt 满足自己的需要。一个这样的模板应该可以为您解决这个问题(或者至少演示如何实现)是 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>
    }
}