【发布时间】:2021-07-21 19:06:59
【问题描述】:
我正在尝试在 Blazor 中创建一个递归列表 <ul>,我这样做的方式看起来合乎逻辑,但我的行为很奇怪,这是我的代码:
代表ul li的类元素:
public class Element
{
public string Title { get; set; }
public Element Parent { get; set; }
public int Index { get; set; }
}
ULComponent.Razor:
@if (DataItems?.Count() > 0)
{
<ul>
@foreach (var element in DataItems)
{
var children = DataItems.Where(e => e.Parent == element).OrderBy(e => e.Index);
<li>
@element.Title
@if (children.Count() > 0)
{
<UlComponent DataItems="children" />
}
</li>
}
</ul>
}
ULComponent.Razor.cs,后面的代码:
public partial class ULComponent
{
[Parameter]
public IEnumerable<Element> DataItems { get; set; }
}
Razor 页面背后的代码:
protected override void OnInitialized()
{
var root = new Element { Title = "Root", Index = 1 };
var element1 = new Element { Title = "Element 1", Index = 1, Parent = root };
var element2 = new Element { Title = "Element 2", Index = 2, Parent = root };
var element3 = new Element { Title = "Element 3", Index = 3, Parent = root };
var element11 = new Element { Title = "Element 1.1", Index = 1, Parent = element1 };
var element12 = new Element { Title = "Element 1.2", Index = 2, Parent = element1 };
var element121 = new Element { Title = "Element 1.2.1", Index = 1, Parent = element12 };
var element21 = new Element { Title = "Element 2.1", Index = 1, Parent = element2 };
var element22 = new Element { Title = "Element 2.2", Index = 2, Parent = element2 };
var element31 = new Element { Title = "Element 3.1", Index = 1, Parent = element3 };
Elements = new List<Element> {root, element1, element2, element3, element11,
element12, element121, element21, element22, element31};
}
剃刀页面:
@if (Elements != null)
{
<div class="row">
<ULComponent DataItems="Elements"/>
</div>
}
代码向上的结果。
Root
Element 1
Element 2
Element 3
Element 1
Element 1.1
Element 1.2
Element 2
Element 2.1
Element 2.2
Element 3
Element 3.1
Element 1.1
Element 1.2
Element 1.2.1
Element 1.2.1
Element 2.1
Element 2.2
Element 3.1
我想得到这个:
Root
Element 1
Element 1.1
Element 1.2
Element 1.2.1
Element 2
Element 2.1
Element 2.2
Element 3
Element 3.1
【问题讨论】:
-
不应该
<MyReport DataItems="children" />是<ULComponent />? -
对不起,我更正了!
-
FWIW,你得到的结果是我对你的代码的期望。在第一个循环中,您的列表中的每个项目都有一个
<li>,并且对于其中的每个项目,都有一个<ul>,只有它们的直系子级。如果您不想失去孩子的孩子,您需要以某种方式将整个集合传递给子组件
标签: c# asp.net-core blazor