我可以在Blazor中编写一个在视图中动态呈现元素的函数吗?

时间:2019-07-18 09:51:44

标签: razor mvvm blazor blazor-server-side

我有一个名为BusinessUnit的对象,该对象包含子业务单位的列表,并且我需要一个函数,该函数为父项下的每个子项呈现

  • 元素。到目前为止,我的代码如下:

    <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#代码动态呈现列表标记?坦:)

  • 2 个答案:

    答案 0 :(得分:5)

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

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

    答案 1 :(得分:0)

    我对Peter Morris的代码做了一些改进:

    <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; }
    }
    

    我添加了null检查,因为当属性为null时遇到问题,修复了ul的id中的错字,并将id更改为class。