ASP.NET MVC 3嵌套列表

时间:2011-11-23 17:29:11

标签: asp.net-mvc-3

我是MVC世界的新手,需要一些指导。我正在尝试为网站创建一个垂直的多级菜单。菜单的数据存储在具有以下结构的数据库表中:

ID, categoryName, parentID

如何使用常规ADO.NET和MVC进行此操作?据我所知,我需要使用MenuItemint IDstring name属性制作List<MenuItem> Children课程。然后我需要创建和表示垂直菜单的类的实例,然后我需要为视图生成HTML。

我在网上搜索了一个易于理解的例子,但我找不到任何我能理解的内容。如果那里有任何人可以指导我完成这一点,那将是非常有用的!

1 个答案:

答案 0 :(得分:2)

您应该编辑您的问题或将其拆分为更具体的问题。

我将在评论中回答有关如何递归加载MenuItem的具体问题。

您写的是使用常规ADO.NET。我可以在我的示例代码中自由使用dapper,这会让生活变得更轻松:

所以这是MenuItem类:

public class MenuItem
{
    public int Id { get; set; }
    public int? ParentId { get; set; }
    public List<MenuItem> Children { get; set; }
}

现在我们打开一个连接并将整个MenuItems表加载到一个集合中:

SqlConnection conn = new SqlConnection("...");
conn.Open();
IEnumerable<MenuItem> allItems = conn.Query<MenuItem>("SELECT * FROM MenuItems");

我假装你有一个MenuItem作为ParentId = null的根项目。让我们找到它:

MenuItem rootMenu = allItems.Single(m => m.ParentId == null);

我们要做的最后一件事是重新排列分层树中的项目。我们使用递归工作的函数来执行此操作:

loadChildren(rootMenu, allItems);

这是功能。它只是查找传递项目的子项,并在所有找到的子节点上调用自己:

private static void loadChildren(MenuItem currentItem, 
                                IEnumerable<MenuItem> allItems)
{
    currentItem.Children = allItems
                             .Where(m => m.ParentId == currentItem.Id).ToList();
    foreach (var childItem in currentItem.Children)
    {
        loadChildren(childItem, allItems);
    }
}