为模板中的树视图生成递归获取 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
我的结构是这样设置的: 我有许多服务 (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