ASP.NET MVC 3 Razor递归函数

Dyn*_*nde 72 c# asp.net-mvc razor asp.net-mvc-3

好的,所以我想显示一个包含列表列表的列表......

我无法知道要显示多少级别,所以我认为这是我打破旧的递归例程的地方.

我确实遇到了如何解决这个问题.

这是我到目前为止(在视图中简化):

@foreach(MyObject item in @Model.ListOfObjects){ 
    <div> @item.Title </div>
    //Call recursive function?
}
Run Code Online (Sandbox Code Playgroud)

现在,每个对象也都有一个List <MyObject>.我想在这个div下面显示每个级别,例如每个级别有一个选项卡缩进.

我在想Razor函数就是这里要做的事情,但我需要一些帮助来形成它.这是我的想法:

@functions{
    public static void ShowSubItems(MyObject _object){
         if(_object.ListOfObjects.Count>0){
             foreach(MyObject subItem in _object.listOfObjects){

                 // Show subItem in HTML
                 ShowSubItems(subItem);
             }
         }
     }
 }
Run Code Online (Sandbox Code Playgroud)

但正如你所看到的,我显然需要一些帮助:)

Pao*_*tti 196

Razor视图引擎允许使用@helper关键字编写内联递归助手.

@helper ShowTree(IEnumerable<Foo> foos)
{
    <ul>
        @foreach (var foo in foos)
        {
            <li>
                @foo.Title
                @if (foo.Children.Any())
                {
                    @ShowTree(foo.Children)
                }
            </li>
        }
    </ul>
}
Run Code Online (Sandbox Code Playgroud)

  • 还有一件事是它必须通过**@ ShowTree(Foos)**来查看** (4认同)
  • 非常感谢!并不是说其他​​答案有什么问题,但这确实是一种更好的方法. (2认同)
  • 如何在asp.net core 2中实现这段代码?在asp.net core 2中,没有@helper (2认同)
  • @Jahan 看起来`@helper`s 在 ASP.NET Core 中消失了。内联函数是一种潜在的替代方法:https://github.com/aspnet/Razor/issues/715#issuecomment-272890766 但看起来可读性要差得多! (2认同)

Edw*_*ing 12

我认为最好为此创建一个HTML帮助器.像这样的东西:

public static string ShowSubItems(this HtmlHelper helper, MyObject _object)
{
     StringBuilder output = new StringBuilder();
     if(_object.ListOfObjects.Count > 0)
     {
         output.Append("<ul>");

         foreach(MyObject subItem in _object.listOfObjects)
         {
             output.Append("<li>");
             output.Append(_object.Title);
             output.Append(html.ShowSubItems(subItem.listOfObjects);
             output.Append("</li>")
         }
         output.Append("</ul>");
     }
     return output.ToString();
}
Run Code Online (Sandbox Code Playgroud)

然后像这样称呼它:

@foreach(MyObject item in @Model.ListOfObjects){
    <div> @item.Title </div>
    @html.ShowSubItems(item)
}
Run Code Online (Sandbox Code Playgroud)


Pra*_*gcs 5

在.Net core中,我们必须使用@functions而不是辅助标签。下面的代码可能对某些人有用。这里的“IssuerData”是我的自定义对象

@{
      ShowTreeData(Model.HierarchyList);
}

    @functions{

  public static void ShowTreeData(IList<IssuerData> issuers)
      {
       <ul>
      @foreach (var i in issuers)
           {
           <li>
            @i.IssuerName
             @if (i.Children.Any())
               {
                 ShowTreeData(i.Children);
               }
            </li>
          }
       </ul>
       }
   }
Run Code Online (Sandbox Code Playgroud)