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?
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.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.
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
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); %>
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