2010-09-24 3 views
2

У меня такое чувство, что я делаю это ужасно, ужасно неправильно. Вложенные для циклов? Каков наилучший метод перечисления подкатегорий? У меня есть ощущение, что это связано с подготовкой списка в действии моего контроллера и отправкой его клиенту с помощью некоторого actionresult, но я не знаю с чего начать? Кто-нибудь может указать мне в правильном направлении? Вот мой Hacky код:Создание списка категорий и подкатегорий с помощью asp.net mvc2

<h2>Categories</h2> 
    <a href="javascript:;" onclick="newCategory()">Create New Category</a> 
<br /> 
    <ul class="parent"> 
     <%foreach (var category in Model.Categories){%> 
      <%-- List all of the top-level parent categories --%> 
      <%if (category.IsParent && category.ParentId == 0)%> 
      <li> 
       <span class="buttons"><a href="javascript:;" onclick="editCategory(<%:category.CategoryId%>)" class="edit"></a> <a href="javascript:;" onclick="deleteCategory(<%:category.CategoryId%>)" class="delete"></a></span> 
       <span class="categoryName"><%:category.CategoryName%></span> 
       <span class="positionButtons"><%:Html.ActionLink(" ", "MoveCategoryUp", new {id = category.CategoryId}, 
               new {Class = "moveUp"})%><%:Html.ActionLink(" ", "MoveCategoryDown", new {id = category.CategoryId}, 
               new {Class = "moveDown"})%></span> 
       <%-- List all of the subs for each parent --%> 

        <ul> 
<%-- Level 1 --%>  <%foreach (var sub1 in Model.Categories){%> 
          <%if (sub1.ParentId == category.CategoryId){%> 
           <li> 
            <span class="buttons"><a href="javascript:;" onclick="editCategory(<%:sub1.CategoryId%>)" class="edit"></a> <a href="javascript:;" onclick="deleteCategory(<%:sub1.CategoryId%>)" class="delete"></a></span> 
            <span class="categoryName"><%:category.CategoryName%></span> 
            <span class="positionButtons"><%:Html.ActionLink(" ", "MoveCategoryUp", new {id = sub1.CategoryId},new {Class = "moveUp"})%><%:Html.ActionLink(" ", "MoveCategoryDown", new {id = sub1.CategoryId},new {Class = "moveDown"})%></span> 

            <%-- List all of the subs for each parent --%> 
            <%if (sub1.IsParent){%> 
            <ul> 
<%-- Level 2 --%>      <%foreach (var sub2 in Model.Categories){%> 
              <%if (sub2.ParentId == sub1.CategoryId){%> 
               <li> 
                <span class="buttons"><a href="javascript:;" onclick="editCategory(<%:sub2.CategoryId%>)" class="edit"></a> <a href="javascript:;" onclick="deleteCategory(<%:sub2.CategoryId%>)" class="delete"></a></span> 
                <span class="categoryName"><%:category.CategoryName%></span> 
                <span class="positionButtons"><%:Html.ActionLink(" ", "MoveCategoryUp", new {id = sub2.CategoryId},new {Class = "moveUp"})%><%:Html.ActionLink(" ", "MoveCategoryDown", new {id = sub2.CategoryId},new {Class = "moveDown"})%></span> 
                <%-- List all of the subs for each parent --%> 
                <%if (sub2.IsParent){%> 
                <ul> 
<%-- Level 3 --%>          <%foreach (var sub3 in Model.Categories){%> 
                  <%if (sub3.ParentId == sub2.CategoryId){%> 
                   <li> 
                    <span class="buttons"><a href="javascript:;" onclick="editCategory(<%:sub3.CategoryId%>)" class="edit"></a> <a href="javascript:;" onclick="deleteCategory(<%:sub3.CategoryId%>)" class="delete"></a></span> 
                    <span class="categoryName"><%:category.CategoryName%></span> 
                    <span class="positionButtons"><%:Html.ActionLink(" ", "MoveCategoryUp",new {id = sub3.CategoryId},new {Class = "moveUp"})%><%:Html.ActionLink(" ", "MoveCategoryDown",new {id = sub3.CategoryId},new {Class = "moveDown"})%></span> 

                    <%-- List all of the subs for each parent --%> 
                    <%if (sub3.IsParent){%> 
                    <ul> 
<%-- Level 4 --%>              <%foreach (var sub4 in Model.Categories){%> 
                      <%if (sub4.ParentId == sub3.CategoryId){%> 
                       <li> 
                        <span class="buttons"><a href="javascript:;" onclick="editCategory(<%:sub4.CategoryId%>)" class="edit"></a> <a href="javascript:;" onclick="deleteCategory(<%:sub4.CategoryId%>)" class="delete"></a></span> 
                        <span class="categoryName"><%:category.CategoryName%></span> 
                        <span class="positionButtons"><%:Html.ActionLink(" ", "MoveCategoryUp", new {id = sub4.CategoryId}, new {Class = "moveUp"})%><%:Html.ActionLink(" ", "MoveCategoryDown", new {id = sub4.CategoryId}, new {Class = "moveDown"})%></span> 

                        <%-- If more than 4 levels of subcategories are required, put another level here --%> 
                       </li> 
                      <%}%> 
                     <%}%> 
                    </ul> 
                    <%}%> 
                   </li> 
                  <%}%> 
                 <%}%> 
                </ul> 
                <%}%> 
               </li> 
              <%}%> 
             <%}%> 
            </ul> 
            <%}%> 
           </li> 
          <%}%> 
         <%}%> 
        </ul> 
      </li> 

     <%}%> 

    </ul> 

Редактировать

К сожалению, этот код не делает результаты я ищу, так что я не могу реально обеспечить гораздо больше, чем это: http://jsfiddle.net/EeaGr/ каждый элемент списка имеет кнопки для вариантов редактирования/удаления и перемещения/сдвинута для своей категории. Моя категория имеет следующие свойства:

CategoryId: INT

Имя: строка

ParentID: INT

IsParent: BOOL

Должность: Int

+6

Святая мать Божия. –

+0

У меня возникли трудности с визуализацией вывода этого! Есть ли вероятность, что вы можете предоставить визуализированный вид HTML в http://jsfiddle.net/ ?? Вы также можете добавить CSS, чтобы мы могли посмотреть, что вы видите на странице – DaveDev

+0

Lol, 2 года спустя, и я смотрю на это, я могу только повторить то, что Дарин упомянул ... «Святая мать Бога», ...о чем я только думал? – Gallen

ответ

6

Во-первых, я бы измените структуру категорий, так что каждый Category имеет свойство Subcategories.

Затем вы должны создать пользовательский элемент управления, который отображает один Category и если эта категория имеет подкатегории, она называет себя рекурсивно:

CategoryControl.ascx:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Category>" %> 
<%@ Import Namespace="so_subcats.Model" %> 
<li><%= Model.Name %> 
    <% if (Model.Subcategories != null) { %> 
     <ul> 
     <% foreach (Category subcat in Model.Subcategories) 
      Html.RenderPartial("CategoryControl", subcat); %> 
     </ul> 
    <% } %> 
</li> 

Тогда просто создать View который предоставляет этот контроль для каждой категории высшего разряда:

Разделы .aspx:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" 
    Inherits="System.Web.Mvc.ViewPage<IEnumerable<Category>>" %> 
<%@ Import Namespace="so_subcats.Model" %> 

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server"> 
    Categories 
</asp:Content> 

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> 

    <h2>Categories</h2> 
     <ul> 
     <% foreach (Category cat in Model) 
      Html.RenderPartial("CategoryControl", cat); %> 
     </ul> 

</asp:Content> 

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

+0

Могу ли я добавить это свойство на уровне базы данных или в классе модели? – Gallen

+0

В вашей модели. Это другой конец отношения «один ко многим», представленный ParentId в БД (возможно, вы должны изменить его на «Родитель», чтобы он ссылался на родительский объект в вашей модели). – svick

+0

+1 Я бы тоже пошел по этому маршруту или имел специальный хелпер-хелпер, который использовал рекурсивный метод. то же самое выше, просто сделанное внутри представления, а не модель (или в этом случае я бы поместил ее в «задачу») –

Смежные вопросы