4

我有一个名为 BusinessUnit 的对象,其中包含一个子业务单位列表,我需要一个函数来为其父级下的每个子级呈现 <li> 元素。我到目前为止的代码如下:

<ul id="Level0">
    @foreach (var bizUnit in businessUnitViewModel.BusinessUnitInfos)
    {
        <li>
            <span>@bizUnit.BusinessUnitName</span>
                <ul class="nested">
                    @foreach (var childOfbizUnit in bizUnit.Children)
                    {
                        <li>@childOfbizUnit.BusinessUnitName</li>
                    }
                </ul>
        </li>
    }
</ul>

嵌套的 foreach 与第一个基本相同,但对它们进行硬编码限制了我可以拥有的层次级别。我需要这样的功能:

 public void HasKids(BusinessUnitInfo bizUnit)
    {
        foreach (var bizUnitChild in bizUnit.Children)
        {
            //Render an <li> tag element with bizUnitChild's 
            name<li>bizUnitChild.Name</li>

            HasKids(bizUnitChild);
        }
    }

有谁知道我可以为最后一个代码块中的注释做什么?我可以使用 C# 代码动态呈现列表标记吗?比:)

4

2 回答 2

10

如果结构是一棵树,那么您实际上需要一个递归组件。

注意@key:出于性能原因,从循环生成 UI 标记时应始终使用该指令。您可以在Blazor 大学阅读更多内容。

<li>
  @Item.Name
  if (@Item.Children.Any())
  {
    <ul id="@level">
      @foreach(var child in Item.Children)
      {
        <ShowItem Item=@child Level="@(Level + 1)" @key=child/>
      }
    </ul>
  }
</li>

@code {
  [Parameter] MyElementClass Item { get; set; }
  [Parameter] int Level { get; set; }
}

在您的主页中,您只需执行此操作

<ul level="0">
  @foreach(var item in TopLevelItems)
  {
    <ShowItem Item=@item Level=1 @key=item/>
  }
</ul>
于 2019-07-18T10:16:50.340 回答
0

I made some improvements for Peter Morris's code:

<li>
  @Item.Name
  @if (Item.Children != null && Item.Children.Any())
  {
    <ul class="@Level">
      @foreach(var child in Item.Children)
      {
        <ShowItem Item=@child Level="@(Level + 1)" @key=child/>
      }
    </ul>
  }
</li>

@code {
  [Parameter] public MyElementClass Item { get; set; }
  [Parameter] public int Level { get; set; }
}

I added null check, because I had problems when the property was null, fixed a typo in the Id of the ul and changed the id to class.

于 2020-05-27T12:23:41.343 回答