web-dev-qa-db-ja.com

ASP.NET MVC 3 Razor再帰関数

さて、リストのリストのリストを含むリストを表示したい...

表示するレベルの数を知る方法がないため、これが古い再帰ルーチンを解決する場所だと考えました。

しかし、私はこれをどうやって進めるのか正確には問題があります。

これは私がこれまでに持っているものです(ビューで-簡略化):

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

しかし、あなたが見ることができるように、私は明らかにいくつかの助けが必要です:)

72
Dynde

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>
}
197
Paolo Moretti

これには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)
}
12
Edwin de Koning