Asp.Net Core进行递归菜单返回给前端

本文介绍了如何在ASP.NET Core中构建递归菜单,包括设计菜单模型,使用Entity Framework Core查询数据库,递归处理菜单数据,以及在前端使用JavaScript或Vue.js进行递归渲染。同时,提到了注意事项,如防止循环引用,优化性能以及序列化为JSON的处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据库表格的设计

菜单的实体类

定义菜单数据模型: 首先,你需要定义一个菜单数据模型来表示菜单项。该模型应当包含菜单的ID、名称、URL以及子菜单列表等属性。

查询数据库: 在数据库中存储菜单项的数据,并编写适当的查询方法从数据库中检索菜单项数据。你可以使用Entity Framework Core或其他适用的ORM工具来简化数据库查询工作。

构建递归菜单: 在你获取菜单项数据后,通过递归方法来构建递归菜单。递归方法将遍历菜单项列表,并根据菜单项的父子关系递归地构建菜单层次结构。最终,该方法将返回一个拥有正确层次结构的菜单项列表。

 public class MenuInfo : BaseEntity
    {

        //[Column(TypeName = "varchar(36)")]
        //public string Id { get; set; } /*主键Id  */

        [Column(TypeName = "varchar(36)")]
        public string Title { get; set; }  /*标题    */

        [Column(TypeName = "varchar(36)")]
        public string? Description { get; set; }  /*描述    */

        public int Level { get; set; }/*等级    */

        public int Sort { get; set; }  /*排序    */

        [Column(TypeName = "varchar(100)")]
        public string? Href { get; set; } /*访问地址*/

        [Column(TypeName = "varchar(36)")]
        public string? ParentId { get; set; } /*父菜单id*/

        [Column(TypeName = "varchar(36)")]
        public string Icon { get; set; } /*图标样式*/

        [Column(TypeName = "varchar(36)")]
        public string Target { get; set; } /*目标    */

        public DateTime CreateTime { get; set; } /*添加时间*/

        public bool IsDelete { get; set; }/*是否删除*/

        public DateTime? DeleteTime { get; set; }/*删除时间*/


    }

我是通过继承BaseEntity来使用里面的id,这样每次创建实体类就不需要手动加id字段了。

其中可以通过ParentId来实现多级菜单,后面会进行数据库展示。

业务逻辑层Bll

从数据源获取菜单数据: 接下来,你需要从数据源(如数据库)中获取菜单数据并构建菜单项。可以使用Entity Framework Core或其他数据访问技术来查询菜单数据。

在递归方法中,你可以首先查询具有特定父菜单ID的菜单项,并对每个菜单项进行递归调用,处理其子菜单。

 /// <summary>
        /// 获取菜单
        /// </summary>
        /// <returns></returns>
        public List<HomeIndexMenu> HomeIndexMenuInfo(string userId)
        {
            UserInfo userInfo = _userInfoDAL.GetInfos().FirstOrDefault(u => u.Id == userId);
            if (userInfo == null)
            {
                return new List<HomeIndexMenu>();
            }

            List<HomeIndexMenu> GetMenu;
            //是否是管理员
            if (userInfo.IsAdmin)
            {
                GetMenu = _MenuInfoDAL.GetInfos().Select(m => new HomeIndexMenu()
                {
                    Title = m.Title,
                    Target = m.Target,
                    Href = m.Href,
                    Icon = m.Icon,
                    Level = m.Level,
                    ParentId = m.ParentId,
                    Id = m.Id
                }).ToList();
            }
            else
            {
                List<string> GetMenuId = (from ur in _role_UserInfoDAL.GetInfos().Where(u => u.UserId == userId)
                                          join
                                           rm in _R_Role_MenuDAL.GetInfos()
                                          on ur.RoleId equals rm.RoleId
                                          select rm.MenuId).ToList();

                //先查出所有的菜单
                GetMenu = _MenuInfoDAL.GetInfos().Where(m => GetMenuId.Contains(m.Id)).Select(m => new HomeIndexMenu()
                {
                    Title = m.Title,
                    Target = m.Target,
                    Href = m.Href,
                    Icon = m.Icon,
                    Level = m.Level,
                    ParentId = m.ParentId,
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值