2011-06-21 14 views
67

わかりましたので、私はリストのリストのリストを含むリストを表示したい...ASP.NET MVC 3レイザー再帰関数

私は表示することがありますどのように多くのレベルを知る方法はありませんので、私は考え出しこれは私が古い再帰ルーチンを打ち消すところです。

この問題については、どうやって解決するのかという問題があります。

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

は今、これらの各オブジェクトもリスト< MyObjectにを持っている>: -

は、これは私がこれまで(簡易ビュー)持っているものです。私は、このレベルの下に各レベルを表示したい、レベルごとにタブのインデントを付けたい。

ここでは、かみそりの機能ができると思っていましたが、それを形成するには何か助けが必要です。ここに私の考えだ:

@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

かみそりビューエンジンは@helperキーワードでインライン再帰的ヘルパーを書くことができます。

@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

で表示する必要があるものが残っています。これは本当にうまくいきます。また、cshtmlページでローカル変数を参照するには、http://stackoverflow.com/questions/12943245/access-global-page-variable-in-helperに言及することができます。 –

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