c# - 使用asp.net mvc2生成类别和子类别列表

标签 c# html asp.net-mvc xhtml

我有一种感觉,我这样做是非常非常错误的。嵌套 for 循环?列出子类别的最佳实践方法是什么?我有一种感觉,它涉及在我的 Controller 操作中准备列表并通过某些操作结果将其发送给客户端,但我不知道从哪里开始?有人能指出我正确的方向吗?这是我的黑客代码:

 <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/每个列表项都有用于编辑/删除的按钮以及其类别的上移/下移选项。我的类别具有以下属性:

类别ID:整数

名称:字符串

ParentID:整数

IsParent: bool

位置:整数

最佳答案

首先,我将更改类别的结构,以便每个Category 都有一个Subcategories 属性。

然后,您应该创建一个呈现一个类别的用户控件,如果该类别有子类别,则它会递归地调用自身:

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>

当然,如果你不想改变类的结构,也可以使用这个解决方案,只需稍加修改即可。

关于c# - 使用asp.net mvc2生成类别和子类别列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3791018/

相关文章:

javascript - 如何获得(非常)短的 .mp3 音频文件以在每次击键时播放?

jquery - 部署为虚拟目录时,MVC 站点外部脚本不起作用

c# - 在局部 View 中使用分页,asp.net mvc

html - 浏览域时样式不起作用

c# - Exchange Web 服务 - 使用资源创建约会但与会者看不到资源

c# - 在输入文本中有多个 % 运算符的 LINQ 中等效的 SQL LIKE 运算符是什么?

php - seo 效果 - 包含带有 <html> 标签的文件

c# - 使用 .Net 4.5 异步功能进行套接字编程

c# - 如何将 MMMdyyyyhhmmtt 格式的日期时间字符串转换为日期时间对象?

javascript - 从区域中取消附加 JQuery 拖放项而不删除或隐藏它