为模板中的树视图生成递归获取 Children

Getting Children recursively for a treeview generation in a template

我的结构是这样设置的: 我有许多服务 (DocType),其中包含 children 文档 (DocType)。 Document DocType 可以有其他 Document 元素作为它的 children.

这样,编辑者就可以创建那种树: 服务 > 文档 > 文档 > 文档 > 文档

这可以进行的关卡数量没有限制。

我正在尝试找到一种递归循环遍历每个文档及其后代的方法,但它们需要彼此嵌套。这就是我遇到问题的地方。

我似乎找不到一种简单的方法来递归循环每个 children 的每个级别以生成内容。

这是我目前的情况:

@{ var selection = Model.Children.Where("Visible");
     if (selection.Any()) {
        <ul>
            @foreach (var item in selection) {
            <li>
                <div class="ServiceDocCenterDocumentation">
                    <h4><a href="#" id="Documentation_@item.Id" class="DocCenterDocumentationTitle">@item.Name</a></h4>
                    <div class="DocCenterDocumentationDescription">@item.GetPropertyValue("bodyText")</div>
                </div>
                <div>
                    @foreach (var children in item.Descendants()){
                        @* This is the part I'm struggling with for the last few days *@

                        var actualChildren = children;
                        <h5><a href="#" id="Documentation_@children.Id" class="DocCenterDocumentationTitle">@children.Name</a></h5>
                        <div class="DocCenterDocumentationDescription">@children.GetPropertyValue("bodyText")</div>
                    }
                </div>
            </li>
            }
        </ul>

    }
    }

这是我想要实现的(递归,而不是手动):

<div class="myService">
    <div class="Documents">
        <div class="Document_@elem.Id">
            @elem.bodyText
            foreach (var child in elem.Children){
                <div class="Document_@child.Id">
                    @child.bodyText
                    foreach (var grandchild in child.Children){
                        @* It goes on and on for the amount of levels available *@
                    }
                </div>
            } 
        </div>
    </div>
</div>

我对 Razor 仍然不是很流利,我想知道是否有办法实现我想要实现的目标。

您应该使用 Razor 助手来创建递归函数。

除此之外,您不应该在每个 children 中使用 Descendants,因为它会 return 这个节点下面的每个节点。您只需要它的 children,然后是每个 children 的 children 等等。因此,您会将每个 children 列表传递给函数以显示它。

@{ var selection = Model.Children.Where("Visible");
     if (selection.Any()) {
        <section class="DocCenter">
            @foreach (var item in selection) {
                <section class="Service">
                    <div class="ServiceDocCenterDocumentation">
                        <h1><a href="#" id="Documentation_@item.Id" class="DocCenterDocumentationTitle">@item.Name</a></h1>
                        <div class="DocCenterDocumentationDescription">@item.GetPropertyValue("bodyText")</div>
                    </div>

                    @DisplayChildren(item.Children().Where("Visible"))

                </section>
            }
        </section>

    }
}

@helper DisplayChildren(IEnumerable<IPublishedContent> children){  
    if(children.Any()){  
        <section class="children">
            foreach(var child in children){
                <section class="Document_@child.Id">
                    <div class="DocumentDetails">
                        <h1><a href="#" id="Documentation_@children.Id" class="DocCenterDocumentationTitle">@children.Name</a></h1>
                        <div class="DocCenterDocumentationDescription">@children.GetPropertyValue("bodyText")</div>
                    </div>
                    //Recursive call here
                    @DisplayChildren(child.Children().Where("Visible")) 
                </section>
            }
        </section>
    }
}

另一方面,虽然与递归问题无关,但我会使用<section>元素来分隔parents和children,这样你也可以使用h1对于在部分层次结构中创建的所有标题: Using HTML sections and outlines