Рекурсивна функція ASP.NET MVC 3 Razor


76

Гаразд, я хочу відобразити список, що містить списки списків списків ...

Я ніяк не можу знати, скільки рівнів є для відображення, тому я зрозумів, що тут я розбиваю стару рекурсивну процедуру.

Я маю проблеми з тим, як саме це робити.

Це те, що я маю на сьогодні (з огляду на спрощення):

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

Але, як бачите, мені явно потрібна допомога :)

Відповіді:


206

Механізм подання 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>
}

5
залишається одне, що він повинен зателефонувати на перегляд @ShowTree (Foos)
vicky

1
Це працює дуже добре. Також може мати сенс згадати stackoverflow.com/questions/12943245/… для посилання на локальні змінні на сторінці cshtml.
Тревіс Дж.,

як можна реалізувати цей код в asp.net core 2? в asp.net core 2 немає @helper
Said Roohullah Allem

2
@Jahan Схоже @helper, у ASP.NET Core немає. Вбудовані функції є однією з можливих альтернатив: github.com/aspnet/Razor/issues/715#issuecomment-272890766, але виглядають набагато менш читабельними!
Паоло Моретті

@PaoloMoretti Коли я визначаю це як рекурсивний Func, як я можу це зробити? Я хочу створити вкладені коментарі за допомогою рекурсивного Func. Ця помилка відображається в ID ID VS2018: "Використання неприсвоєної локальної змінної" FunctionName "локальної змінної" FunctionName "може не ініціалізуватися перед доступом"
Саїд Рухулла Аллем,

13

Я думаю, що для цього найкраще створити помічник 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)
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.