RAZOR 页面如何递归生成菜单

_小黑_ 2021-02-14 01:08:55
如题,我想在razor页面生成树形菜单,数据库数据如下

ID MENU_NAME PARENT_ID URL ICON ORDER
1 系统设置 0 NULL NULL 1
2 其他设置 1 NULL NULL 2
3 用户管理 1 User/Index NULL 3
4 测试设置 2 OtherTest/Index NULL 4


以下代码是前台的代码,但是只能生成2级菜单,无法生成多级的,求大神 给个思路 如何生成多级菜单

@if (menus != null)
{
foreach (var module in menus.OrderBy(x => x.ORDER).Where(o => o.PARENT_ID == "0"))
{
<li>
<a href="#">
<i class="@(string.IsNullOrWhiteSpace(module.ICON) ? "fa fa-tv" : module.ICON)"></i>
<span class="nav-label">@module.MENU_NAME</span>
<span class="fa arrow"></span>
</a>
<ul class="nav nav-second-level">
@foreach (var menu in menus.OrderBy(x => x.ORDER).Where(item => item.PARENT_ID == module.ID))
{
<li>
<a class="J_menuItem" href="@menu.URL" data-index="@module.ID">
<i class="@(string.IsNullOrWhiteSpace(module.ICON) ? "fa fa-angle-right" : menu.ICON)"></i>
@menu.MENU_NAME
</a>
</li>
}
</ul>

</li>
}
}
...全文
269 5 打赏 收藏 举报
写回复
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
正怒月神 2021-02-20
你的递归有问题。为什么是2循环的。。。很奇怪 https://blog.csdn.net/hanjun0612/article/details/50563136
  • 打赏
  • 举报
回复
_小黑_ 2021-02-20

       
            var menus = BllHelper.GetList<T_SYS_MENU_INFO>(DBTool.SqlServerMS_Tool);
            lstMenus = menus;
            T_SYS_MENU_INFO menu = new T_SYS_MENU_INFO();
            menu.NavMenus = new List<T_SYS_MENU_INFO>();
            CreateMenu(menu, "0");
            ViewBag.Menu = menu;
 
        private void CreateMenu(T_SYS_MENU_INFO menu,string id)
        {
            var lst = lstMenus.Where(x => x.PARENT_ID == id).OrderBy(x => x.SORT);
            foreach (var item in lst)
            {
                T_SYS_MENU_INFO t = new T_SYS_MENU_INFO();
                t.ID = item.ID;
                t.MENU_NAME = item.MENU_NAME;
                t.URL = item.URL;
                t.ICON = item.ICON;
                t.NavMenus = new List<T_SYS_MENU_INFO>();
                CreateMenu(t, item.ID);
                menu.NavMenus.Add(t);
            }
        }


@model Domain.Entity.Sys.T_SYS_MENU_INFO

@foreach (var item in Model.NavMenus)
{
    if (item.URL == "#" || string.IsNullOrEmpty(item.URL))//
    {
        <li>
            <a href="#">
                <i class="@(string.IsNullOrWhiteSpace(item.ICON) ? "fa fa-tv" : item.ICON)"></i>
                <span class="nav-label">@item.MENU_NAME</span>
                <span class="fa arrow"></span>
            </a>
            <ul class="nav nav-second-level">
                @await Html.PartialAsync("_NavMenu", item);
            </ul>
        </li>
    }
    else //操作项
    {
        <li>
            <a class="J_menuItem" href="@item.URL" data-index="@item.ID">
                <i class="@(string.IsNullOrWhiteSpace(item.ICON)? "fa fa-angle-right" : item.ICON)"></i>
                @item.MENU_NAME
            </a>
        </li>
    }
}


@{
    Domain.Entity.Sys.T_SYS_MENU_INFO menu = ViewBag.Menu;
}
@await Html.PartialAsync("_NavMenu", menu);
  • 打赏
  • 举报
回复
_小黑_ 2021-02-19

        /// <summary>
        /// 生成菜单拼接字符串
        /// </summary>
        /// <returns></returns>
        private string GenerateMenu()
        {
            StringBuilder sb = new StringBuilder();
            var lstAll = BllHelper.GetList<T_SYS_MENU_INFO>(DBTool.SqlServerMS_Tool);
            var lstParent = lstAll.FindAll(x => x.PARENT_ID == "0").ToList();
            var lstChilds = lstAll.FindAll(x => x.PARENT_ID != "0").ToList();

            if (lstParent.Any())
            {
                foreach (var top in lstParent)
                {
                    sb.AppendLine("<li>")
                        .AppendLine("<a href = \"#\" >")
                        .AppendFormat("<i class=\"{0}\"></i>", (string.IsNullOrWhiteSpace(top.ICON) ? "fa fa-tv" : top.ICON))
                        .AppendFormat("<span class=\"nav-label\">{0}</span>", top.MENU_NAME)
                        .AppendLine("<span class=\"fa arrow\"></span>")
                        .AppendLine("</a>")
                        .AppendLine("<ul class=\"nav nav - second - level\">");
                    var lstOnes = lstChilds.FindAll(x => x.PARENT_ID == top.ID).OrderBy(x => x.ORDER).ToList();
                    GetChild(sb, lstChilds, lstOnes);
                    sb.AppendLine("</ul></li>");
                }
            }

            return sb.ToString();
        }

        /// <summary>
        /// 得到子菜单项
        /// </summary>
        /// <param name="sb">StrignBuilder对象</param>
        /// <param name="lstChilds">所有子节点集合</param>
        /// <param name="lstOnes">“父”节点集合</param>
        private void GetChild(StringBuilder sb, List<T_SYS_MENU_INFO> lstChilds, List<T_SYS_MENU_INFO> lstOnes)
        {
            foreach (var chld in lstOnes)
            {
                var lstTwos = lstChilds.FindAll(x => x.PARENT_ID == chld.ID).OrderBy(x => x.ORDER).ToList();

                sb.AppendLine("<li>")
                .AppendFormat("<a class=\"J_menuItem\" href=\"{0}\" data-index=\"{1}\">", chld.URL, chld.ID)
                .AppendFormat("<i class=\"\"></i>", (string.IsNullOrWhiteSpace(chld.ICON) ? "fa fa-angle-right" : chld.ICON))
                .AppendLine(chld.MENU_NAME)
                .AppendLine("</a></li>");
                GetChild(sb, lstChilds, lstTwos);
            }
        }
  • 打赏
  • 举报
回复
_小黑_ 2021-02-19
还有其他的思路吗
  • 打赏
  • 举报
回复
你的那个 @foreach 没有必要写,控件直接递归调用自己就行了。
  • 打赏
  • 举报
回复
相关推荐
发帖
C#

10.8w+

社区成员

.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
帖子事件
创建了帖子
2021-02-14 01:08
社区公告

让您成为最强悍的C#开发者