1

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

4

2 回答 2

7

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

  • ID
  • 菜单文本
  • 网址
  • 父 ID

对于顶级菜单项,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;
}
于 2013-03-27T19:24:33.843 回答
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();
于 2015-03-12T18:40:11.000 回答