ASP.NET MVC 3 Рекурсивная функция бритвы

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

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

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

Это то, что я до сих пор (по-видимому - упрощенный):

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

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

Ответ 1

Механизм просмотра 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>
}

Ответ 2

Я думаю, что лучше всего создать помощник 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)
}