2011-06-21 228 views
67

好了,所以我想以顯示包含列表的列表清單列表...ASP.NET MVC 3剃鬚刀遞歸函數

我不知道有多少級顯示的方式,所以我想通這是我分解舊的遞歸例程的地方。

我遇到了麻煩,究竟該如何去做這件事。

這是我迄今(鑑於 - 簡化):

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

現在,這些對象也有一個List <的MyObject>。我想在div下面顯示每個級別,例如每個級別都有一個tab縮進。

我在想一個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); 
      } 
     } 
    } 
} 

但正如你所看到的,我清楚地需要一些幫助:)

回答

179

的Razor視圖引擎允許寫與@helper inline關鍵字遞歸幫手。

@helper ShowTree(IEnumerable<Foo> foos) 
{ 
    <ul> 
     @foreach (var foo in foos) 
     { 
      <li> 
       @foo.Title 
       @if (foo.Children.Any()) 
       { 
        @ShowTree(foo.Children) 
       } 
      </li> 
     } 
    </ul> 
} 
+2

這是美麗的謝謝!不是說其他​​答案有什麼問題,但這確實是一個更好的方法。 – Dynde

+3

剩下的一件事情就是它必須通過** @ ShowTree(Foos)來查看** – vicky

+1

這很有效。也可以提到http://stackoverflow.com/questions/12943245/access-global-page-variable-in-helper引用cshtml頁面上的局部變量。 –

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

然後調用它像這樣:

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