Рекурсия в представлении ASP.NET MVC

Я решил эту проблему, запустив bitvise в режиме совместимости с windows 7

25
задан CoderDennis 2 June 2009 в 23:57
поделиться

3 ответа

Создайте свой собственный метод расширения HtmlHelper следующим образом:

namespace System.Web.Mvc
{
    public static class HtmlHelperExtensions
    {
        public static string CategoryTree(this HtmlHelper html, IEnumerable<Category> categories)
        {
            string htmlOutput = string.Empty;

            if (categories.Count() > 0)
            {
                htmlOutput += "<ul>";
                foreach (Category category in Categories)
                {
                    htmlOutput += "<li>";
                    htmlOutput += category.Name;
                    htmlOutput += html.CategoryTree(category.Categories);
                    htmlOutput += "</li>";
                }
                htmlOutput += "</ul>";
            }

            return htmlOutput;
        }
    }
}

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

34
ответ дан 28 November 2019 в 17:47
поделиться

Вы можете легко сделать это, поместив каждый список

    в PartialView , и для каждого нового списка, который вам нужно запустить, просто позвоните Html.RenderPartial ("myPartialName"); .

    Таким образом, Категория PartialView может выглядеть следующим образом:

    <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IEnumerable<Category>>" %>
    <% foreach(Category cat in ViewData.Model) { %>
         <li><p><%= cat.name %></p>
            <% if (cat.categories.Count > 0) {
                    Html.RenderPartial("Category", cat.Categories);
               } %></li>
    <% } %>
    

    В вашем представлении вы просто отправляете «корневую» коллекцию как модель для частичного представления:

    <% Html.RenderPartial("Category", ViewData.Model) %>
    

    РЕДАКТИРОВАТЬ:

    • Я забыл второй параметр вызова Html.RenderPartial () - конечно, категория должна быть передана в качестве модели.
    • ] Конечно, вы правы насчет ошибки СУХОЙ, которую я сделал - я соответствующим образом обновил свой код.
26
ответ дан 28 November 2019 в 17:47
поделиться

Вы можете повторно использовать части html с помощью ламбд

Пример


public class Category
    {
        public int id;
        public string name;
        public IEnumerable categories;
    }
 <%
        Action<IEnumerable<Category>> categoriesMacros = null;
        categoriesMacros = categories => { %>
        <ul>
            <% foreach(var c in categories) { %>
                <li> <%= Html.Encode(c.name)%> </li>
                <% if (c.categories != null && c.categories.Count() > 0) categoriesMacros(c.categories);  %>
            <% } %>
        </ul>
        <% }; %>

    <% var categpries = (IEnumerable<Category>)ViewData["categories"]; %>
    <% categoriesMacros(categpries); %>
6
ответ дан 28 November 2019 в 17:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: