繁体   English   中英

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

[英]How to create infinite nested sub menus?

我正在尝试编写一个模块。它的菜单管理模块,您可以创建菜单和子菜单。 但是现在在我的模块中,您的菜单深度可以达到三层,这意味着我的模块支持一个根菜单,一个子菜单以及一个最大子菜单,但是我正在考虑创建无限嵌套子菜单的算法以及如何我想让用户自由创建无限的嵌套子菜单。我不知道应该如何设置模型和数据库来实现我的目标。我正在使用MVC3,C#和实体框架。 谢谢。

就数据模型而言,您可能需要:

  • ID
  • 菜单文字
  • 网址
  • 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;
}
    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();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM