如何创建无限嵌套子菜单?

时间:2013-03-27 19:13:40

标签: c# asp.net-mvc-3 entity-framework

我正在尝试编写一个module.Its菜单管理模块,您可以创建菜单和子菜单,您想要多少。 但是现在在我的模块中你的菜单深度可以是三个。这意味着我的模块支持一个根菜单,它的子节点和孩子的子节点最多,但我正在考虑创建无限嵌套子菜单的算法以及如何在网站上显示它们。我的意思是我想让用户自由创建无限的嵌套子菜单。我不知道我的模型和数据库应该如何设置以实现我的目标。我正在使用MVC3和C#以及实体框架。 感谢。

2 个答案:

答案 0 :(得分:7)

就数据模型而言,您可以:

  • 编号
  • MenuText
  • 地址
  • 的ParentId

对于顶级菜单项,ParentId将为NULL。否则,它指向父母。

大多数UI菜单(如Superfish.js)使用<ul><li>元素来呈现菜单。只需遍历数据库中的菜单项即可构建<ul>结构。

这是一个开始:

private void BuildMenu()
{
    List<MenuItem> menuItems = GetTopLevelMenuItems();

    string html = "<ul>";

    foreach (var menuItem in menuItems)
    {
        html += BuildMenuSubMenu(menuItem);
    }
    html += "</ul>"
}

private string BuildMenuSubMenu(MenuItem menuItem)
{
    string html = string.Empty;

    List<MenuItem> childItems = GetChildItems(menuItem);

    html += string.Format("<li><a href=\"{0}\">{1}</a>", menuItem.Url, menuItem.MenuText);

    if (childItems.Count > 0)
    {
        html += "<ul>";
        foreach (var child in childItems)
        {
            html += BuildMenuSubMenu(child);
        }
        html += "<ul>";
    }

    html += "<li>";

    return html;
}

答案 1 :(得分:0)

    public List<_Category> GetTopLevelMenuItems() 
    { 
       entityName db = new entityName();
       var categories = db.Category.Where(x => x.CategoryID == null).Select(x => new _Category() { 
    ID = x.ID,
    CategoryName = x.CategoryName

    }).ToList();

    return categories;
    }

    public List<_Category> GetChildItems(_Category C)
    {

        entityName db = new entityName();
        var categories = db.Category.Where(x => x.CategoryID == C.ID).Select(x => new _Category()
        {
            ID = x.ID,
            CategoryName = x.CategoryName,


        }).ToList();
        return categories;
    }
    public string BuildMenu()
    {
        List<_Category> menuItems = GetTopLevelMenuItems();

        string html = "<ul>";

        foreach (var menuItem in menuItems)
        {
            html += BuildMenuSubMenu(menuItem);
        }
        html += "</ul>";
        return html;
    }
    public string BuildMenuSubMenu(_Category menuItem)
    {
        string html = string.Empty;

        List<_Category> childItems = GetChildItems(menuItem);

        html += string.Format("<li><a href=\"{0}\">{1}</a>", menuItem.ID, menuItem.CategoryName);

        if (childItems.Count > 0)
        {
            html += "<ul>";
            foreach (var child in childItems)
            {
                html += BuildMenuSubMenu(child);
            }
            html += "</ul>";

        }

        html += "</li>";

        return html;
    }
public class _Category
{
    public int ID { get; set; }
    public int? CategoryID { get; set; }
    public string CategoryName { get; set; }
}
  • 编辑完整代码

在ActionResult中使用:

ViewData["menu"] = BuildMenu();