ASP.NET MVC 3 Razor递归函数

83

好的,我想要显示一个包含列表、列表的列表和列表的列表的列表...

我无法知道有多少级需要显示,所以我觉得这就是我使用旧递归例程的地方。

不过,我还在犯难如何处理这个问题。

到目前为止,这是我的代码(视图中简化):

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

现在每个对象也有一个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);
             }
         }
     }
 }

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

3个回答

217

利用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>
}

5
还有一件事情需要完成,它必须通过 @ShowTree(Foos) 调用视图。 - vicky
1
这个非常有效。同时,提到https://dev59.com/v2cs5IYBdhLWcg3wUCYI可能有助于引用cshtml页面上的本地变量。 - Travis J
2
这段代码如何在asp.net core 2中实现? 在asp.net core 2中,没有@helper。 - x19
2
@Jahan,看起来在ASP.NET Core中已经没有@helper了。内联函数是一种潜在的替代方案:https://github.com/aspnet/Razor/issues/715#issuecomment-272890766,但看起来可读性要低得多! - Paolo Moretti
@PaoloMoretti 当我将其定义为递归函数时,我该如何做? 我想使用递归函数创建嵌套评论。 在VS2018 IDE中显示以下错误: “使用未分配的本地变量'FunctionName',本地变量'FunctionName'可能在访问之前未初始化” - x19
@PaoloMoretti 请访问此问题: https://stackoverflow.com/q/48211043/1817640 - x19

13

我认为最好为此创建一个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();
}

然后像这样调用:

@foreach(MyObject item in @Model.ListOfObjects){
    <div> @item.Title </div>
    @html.ShowSubItems(item)
}

4

.Net Core 中,我们需要使用 @functions 替代帮助器标记(helper tag)。以下代码可能对某些人有用。这里的 "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>
       }
   }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接