使用ACE admin实现无限添加菜单栏

其实功能更其他的递归生成是完全相同的。

首先是在数据库创建一个数据表、需要包含ID与父ID

使用ACE admin实现无限添加菜单栏_第1张图片

接下来是创建一个树结构的类,可以按照自己的需求,添加不同的字段

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace yyyu.Common.TreeList
{
    //树存储实体
    public class TreeObject
    {
        public string Id { get; set; }
        public string Pid { get; set; }
        public string Name { get; set; }
        public string ShowName { get; set; }
        public string url { get; set; }
        public List Children { get; set; }  
    }
}

然后是读取数据库的数据为dataset或者DATATABLE,这部分的代码就省略了

接下来是逻辑处理方法,

  /// 
        /// 将DataTable获取到的值转化为树级结构list
        /// 
        /// 
        /// 
        private List GetPNode(DataSet ds) 
        {
            List list = new List();
            if (ds.Tables[0].Rows.Count > 0)
            {
                //循环读取
                for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
                {
                    if (ds.Tables[0].Rows[i]["Menu_ParentId"].ToString() == "-1")
                    {
                        yyyu.Common.TreeList.TreeObject tree = new yyyu.Common.TreeList.TreeObject();
                        tree.Id = ds.Tables[0].Rows[i]["Menu_Id"].ToString();//读取列可以根据不同的需要修改
                        tree.Name = ds.Tables[0].Rows[i]["Name"].ToString();
                        tree.ShowName = ds.Tables[0].Rows[i]["ShowName"].ToString();
                        if (ds.Tables[0].Rows[i]["NodeUrl"].ToString() == "" || ds.Tables[0].Rows[i]["NodeUrl"] == null)
                        {
                            tree.url = "";
                        }
                        else
                        {
                            tree.url = ds.Tables[0].Rows[i]["NodeUrl"].ToString();
                        }
                        tree.Pid = "-1";
                        tree.Children = GetChild(tree.Id);
                        list.Add(tree);
                    }
                }
            }
            return list;
        }
        /// 
        /// 递归获取子节点
        /// 
        /// 父节点参数
        /// 
        private List GetChild(string pid) 
        {
            yyyu.BLL.yyyu_tblSysMenu bll=new yyyu.BLL.yyyu_tblSysMenu();
            DataTable dt = bll.GetList("Menu_ParentId=" + pid).Tables[0];//获取数据
            List list = new List();
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                yyyu.Common.TreeList.TreeObject tree = new yyyu.Common.TreeList.TreeObject();
                tree.Id = dt.Rows[i]["Menu_Id"].ToString();//读取列可以根据不同的需要修改
                tree.Name = dt.Rows[i]["Name"].ToString();
                tree.Pid = dt.Rows[i]["Menu_ParentId"].ToString();
                tree.ShowName = dt.Rows[i]["ShowName"].ToString();
                if (dt.Rows[i]["NodeUrl"].ToString() == "" || dt.Rows[i]["NodeUrl"] == null)
                {
                    tree.url = "";
                }
                else
                {
                    tree.url = dt.Rows[i]["NodeUrl"].ToString();
                }
                DataTable dt1 = bll.GetList("Menu_ParentId=" + tree.Id).Tables[0];//获取数据
                if (dt1!=null)
                {
                    tree.Children = GetChild(tree.Id);
                }
                list.Add(tree);
            }
            return list;
        }

服务端调用方法

        //递归读取菜单
        public string GetMenu() 
        {
            yyyu.BLL.yyyu_tblSysMenu bll=new yyyu.BLL.yyyu_tblSysMenu();
            DataSet ds = bll.GetList("IsActive=1");//获取数据
            List list = GetPNode(ds);//转换数据为树结构
            //传入list,转化为HTML代码输出
            string strJson = MenuForHtml(list);//为了省事,在后台先拼接好前台的HTML字符串
            return strJson;
        }

为了方便,写了一个HTML的拼接在后台,直接输出HTML

        /// 
        /// 将list转化为菜单栏的数据,输出到界面上
        /// 
        /// 
        /// 
        public string MenuForHtml(List list) 
        {
            string html = "";
            StringBuilder sb = new StringBuilder();
            if (list.Count>0)
            {
                for (int i = 0; i < list.Count; i++)
                {
                    sb.Append("
  • ");//菜单li if (list[i].url=="") { sb.Append(""); } else { sb.Append(""); } sb.Append(""); sb.Append(""+list[i].ShowName+""); sb.Append(""); sb.Append(""); sb.Append(""); if (list[i].Children.Count>0) { sb.Append(MenuForSonHtml(list[i].Children)); } } html = sb.ToString(); } return html; } public string MenuForSonHtml(List list) { string str = ""; StringBuilder sb = new StringBuilder(); sb.Append(""); str=sb.ToString(); return str; }
  • 输出后是返回一个HTML字符串,前台使用AJAX接收后赋值就可以了

            //默认加载菜单
            $(function ()
            {
                //获取父菜单栏
                $.ajax({
                    url: '/Main/GetMenu',
                    success: function (data)
                    {
                        var $nav = $("#nav");
                        var html = data;
                        $nav.html(html);
                    }
                });
            });



    你可能感兴趣的:(C#)