ASP.NET MVC 3 Razor рекурсивная функция - PullRequest
72 голосов
/ 21 июня 2011

Хорошо, поэтому я хочу отобразить список, содержащий списки списков списков ...

У меня нет возможности узнать, сколько уровней нужно отобразить, поэтому я решил, что это то место, где я пробиваюсьстарая рекурсивная процедура.

У меня возникли проблемы с тем, как именно это сделать.

Это то, что я до сих пор (на взгляд - упрощенно):

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

Теперь у каждого из этих объектов также есть Список .Я хочу отобразить каждый уровень ниже этого 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);
             }
         }
     }
 }

Но, как вы видите, мне явно нужна помощь:)

Ответы [ 2 ]

197 голосов
/ 21 июня 2011

Движок 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>
}
12 голосов
/ 21 июня 2011

Я думаю, что для этого лучше всего создать помощник 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)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...