Rekurencja w ASP.NET widok MVC

Mam zagnieżdżony obiekt danych dla zestawu elementów w kategoriach. Każda kategoria może zawierać podkategorie i nie ma ustawionego limitu głębokości podkategorii. (System plików miałby podobną strukturę.) Wygląda to mniej więcej tak:

class category
{
    public int id;
    public string name;
    public IQueryable<category> categories;
    public IQueryable<item> items;
}
class item
{
    public int id;
    public string name;
}

Przekazuję listę kategorii do mojego widoku jako IQueryable<category>. Chcę wypisać Kategorie jako zestaw zagnieżdżonych, nieuporządkowanych bloków list (<ul>). Mógłbym zagnieżdżać pętle, ale wtedy głębokość podkategorii byłaby ograniczona przez liczba zagnieżdżonych bloków foreach. W WinForms wykonałem podobne przetwarzanie przy użyciu rekurencji w celu wypełnienia TreeView, ale nie widziałem żadnych przykładów użycia rekurencji w widoku ASPX MVC.

Czy można wykonać rekurencję w widoku ASPX? Czy istnieją inne silniki widoku, które zawierają rekurencję dla wyjścia widoku?

Author: CoderDennis, 2009-06-03

4 answers

Utwórz własną metodę rozszerzenia HtmlHelper w następujący sposób:

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;
        }
    }
}
Zabawne, że pytasz, bo stworzyłem taki właśnie wczoraj.
 33
Author: Charlino,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-05 14:52:51

Można to łatwo zrobić, mając każdą <ul> listę w PartialView, a dla każdej nowej listy trzeba uruchomić po prostu zadzwonić Html.RenderPartial("myPartialName");.

Więc Category PartialView może wyglądać tak:

<%@ 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>
<% } %>

Twoim zdaniem, po prostu wysyłasz kolekcję "root"jako model dla częściowego widoku:

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

EDIT:

  • zapomniałem o drugim parametrze wywołania Html.RenderPartial() - oczywiście Kategoria musi być przekazana jako model.
  • oczywiście masz rację co do suchego popełniłem błąd-odpowiednio zaktualizowałem mój kod.
 25
Author: Tomas Lycken,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-04 11:35:37

Możesz używać metod pomocniczych.

@model Models.CategoryModel

@helper TreeView(List<Models.CategoryModel> categoryTree)
{
    foreach (var item in categoryTree)
    {
    <li>
        @if (item.HasChild)
        {
            <span>@item.CategoryName</span>
            <ul>
                @TreeView(item.ChildCategories)
            </ul>
        }
        else
        {
            <span class="leaf @item.CategoryTreeNodeType.ToString()" id="@item._CategoryId">@item.CategoryName</span> 
        }
    </li>
    }
}

<ul id="categorytree">
    <li>@Model.CategoryName
    @TreeView(Model.ChildCategories)
    </li>
</ul>

Więcej informacji można znaleźć pod tym linkiem: http://weblogs.asp.net/scottgu/archive/2011/05/12/asp-net-mvc-3-and-the-helper-syntax-within-razor.aspx

 19
Author: Ozan BAYRAM,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-12 11:40:48

Możesz ponownie użyć części html za pomocą lambda

Przykład


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
Author: Achmedzhanov Nail,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-29 09:05:33