C# 构造tree菜单工具方法

Stella981
• 阅读 446

如何构造tree数据结构,做个笔记,方便查阅,本方法是直接返回json字符串:

private string ToMenuJson(List<Model> data, string parentId)
        {
            var sbJson = new StringBuilder();
            sbJson.Append("[");
            var entitys = data.FindAll(t => t.ParentID == parentId).ToList();
            if (entitys.Count > 0)
            {
                foreach (var item in entitys)
                {
                    var strJson = JsonConvert.SerializeObject(item, new JsonSerializerSettings { ReferenceLoopHandling = ReferenceLoopHandling.Ignore });
                    strJson = strJson.Insert(strJson.Length - 1, ",\"ChildNodes\":" + ToMenuJson(data, item.ID) + "");
                    sbJson.Append(strJson + ",");
                }
                sbJson = sbJson.Remove(sbJson.Length - 1, 1);
            }
            sbJson.Append("]");
            return sbJson.ToString();
        }

本方法是构造tree实体,返回实体:

/// <summary>
        /// 绑定列表递归方法
        /// </summary>
        /// <param name="ddl">构造tree数据结构返回的实体</param>
        /// <param name="menus">绑定的数据源</param>
        /// <param name="categoryid">父级id值</param>
        private void BindChannelType(List<ECategoryModel> ddl, List<ECategory> menus, Guid categoryid)
        {
            List<ECategory> filterMenu = menus.Where(w => w.ParentID == categoryid).ToList();

            foreach (var m in filterMenu)
            {
                var mextend = new ECategoryModel
                {
                    ID = m.ID,
                    ParentID = m.ParentID,
                    CategoryName = m.CategoryName,
                    URL = m.URL,
                    Sort = m.Sort,
                    IsDelete = m.IsDelete
                };
                ddl.Add(mextend);
                BindChannelType(mextend.children, menus, m.ID);
            }
        }

构造树形数据(带空格和缩进):

/// <summary>
        /// 构造树形下拉框数据结构
        /// </summary>
        private void Generate(List<ECategoryModel> viewList, List<ECategory> categories, Guid categoryid, int i = 0)
        {
            i++;
            var filterMenu = categories.Where(w => w.ParentID == categoryid).OrderBy(w => w.Sort).ToList();

            foreach (var m in filterMenu)
            {
                var str = ""; //父级菜单不缩进 for (var j = 1; j < i; j++) { str += HttpUtility.HtmlDecode("&nbsp;&nbsp;") + "├"; } var mextend = new ECategoryModel { ID = m.ID, ParentID = m.ParentID, CategoryName = $"{str}{m.CategoryName}", URL = m.URL, iconSkin = m.URL, Sort = m.Sort, IsDelete = m.IsDelete }; viewList.Add(mextend); Generate(viewList, categories, m.ID, i); } }

相关的实体类 ECategoryModel.cs

using System;
using System.Collections.Generic;

namespace MSEduPlatform.Models
{
    /// <summary>
    /// ECategory表实体类
    /// </summary>
    public class ECategoryModel
    {
        /// <summary>
        /// 菜单ID
        /// </summary>          
        public Guid ID { get; set; }

        /// <summary>
        /// 父级菜单ID
        /// </summary>          
        public Guid ParentID { get; set; }

        /// <summary>
        /// 菜单Code
        /// </summary>          
        public string Code { get; set; }

        /// <summary>
        /// 菜单名称
        /// </summary>          
        public string CategoryName { get; set; }

        /// <summary>
        /// 菜单地址
        /// </summary>          
        public string URL { get; set; }

        /// <summary>
        /// 菜单排序
        /// </summary>          
        public int Sort { get; set; }

        /// <summary>
        /// 显示状态
        /// </summary>          
        public int States { get; set; }

        /// <summary>
        /// 栏目权限类别
        /// </summary>          
        public string AuthorizationType { get; set; }

        /// <summary>
        /// 是否授权
        /// </summary>          
        public bool IsAuthorization { get; set; }

        /// <summary>
        /// 创建人
        /// </summary>          
        public Guid Creater { get; set; }

        /// <summary>
        /// 创建时间
        /// </summary>          
        public DateTime CreateTime { get; set; }

        /// <summary>
        /// 修改人
        /// </summary>          
        public Guid Modify { get; set; }

        /// <summary>
        /// 修改时间
        /// </summary>          
        public DateTime ModifyTime { get; set; }

        /// <summary>
        /// 是否逻辑删除
        /// </summary>          
        public int IsDelete { get; set; }

        /// <summary>
        /// 子数据列表
        /// </summary>
        public List<ECategoryModel> children = new List<ECategoryModel>();
    }
}
点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
2年前
java将前端的json数组字符串转换为列表
记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang
Wesley13 Wesley13
2年前
java第二次作业
(一)学习总结1.什么是构造方法?什么是构造方法的重载?下面的程序是否可以通过编译?为什么?(1)在对面向对象程序中构造方法的主要作用是为类中的属性初始化。在构造方法中要注意以下几点①构造方法的名称必须与类名称一致②构造方法的声明处不能有任何返回值类型的说明③不能在构造方法中使用return返回一个值(2)构造方法的重载就
Wesley13 Wesley13
2年前
java中的构造方法,this、super的用法
1、构造方法定义:与类同名没有返回值的方法称为构造方法;publicclasstest1{privateStringname;privateintage;publictest1(){}}上面的test1()是默认构造方法,即使没有定义java虚拟机在运行的时候也会自动生成,当然如果定义了重载的构造方
Wesley13 Wesley13
2年前
Java高并发编程四
_做个笔记,java线程常用的方法,耐心看完._编号方法说明1publicvoidstart()使该线程开始执行;Java虚拟机调用该线程的run方法。2publicvoidrun()如果该线程是使用独立的Runnable运行对象构造的,则调用该Runnable对象的run方法;否则,该方
Wesley13 Wesley13
2年前
Java类和对象
一、类类是封装对象的属性和行为的载体,在Java语言中对象的属性以成员变量的形式存在,而对象的方法以成员方法的形式存在。1\.类的构造方法构造方法是一个与类同名的方法,对象的创建就是通过构造方法完成的,构造方法分为有参构造方法和无参构造方法,区别就在于有没有参数。说这么多概念是不是感觉有点麻木,直接看下面的例子吧。pub
Stella981 Stella981
2年前
Python问题汇总
1.dictisnotcallabletree是一个字典类型。tree("left")tree\"left"\2.listindicesmustbeintegersorslices,nottupledataset是原生的python数组,是list类型(python原生数组叫list类型)
Stella981 Stella981
2年前
ELementUI 树形控件tree 获取子节点同时获取半选择状态的父节点ID
使用elementui tree树形控件的时候,在选择一个子节点后,使用getCheckedKeys后,发现只能返回子节点的ID,但是其父节点ID没有返回。解决办法有三种:1.elementui有一个获取半选择状态值ID得方法  getHalfCheckedKeys  这个方法用来获取父节点半选择状态ID值2.修改源码  找到
Wesley13 Wesley13
2年前
Java构造方法与析构方法实例剖析
Java构造方法类有一个特殊的成员方法叫作构造方法,它的作用是创建对象并初始化成员变量。在创建对象时,会自动调用类的构造方法。构造方法定义规则:Java中的构造方法必须与该类具有相同的名字,并且没有方法的返回类型(包括没有void)。另外,构造方法一般都应用public类型来说明,这样才能在程序任意的位置创建类的实例-
Wesley13 Wesley13
2年前
JAVA笔记07日
07.01\_面向对象(构造方法Constructor概述和格式)(掌握)\ A:构造方法概述和作用    \ 给对象的数据(属性)进行初始化\ B:构造方法格式特点    \ a:方法名与类名相同(大小也要与类名一致)    \ b:没有返回值类型,连void都没有    \ c:没有具体的返回值ret
Stella981 Stella981
2年前
OpenCV学习代码记录——Hough线段检测
很久之前学习过一段时间的OpenCV,当时没有做什么笔记,但是代码都还在,这里把它贴出来做个记录。代码放在码云上,地址在这里https://gitee.com/solym/OpenCVTest/tree/master/OpenCVTest(https://gitee.com/solym/OpenCVTest/tree/master/OpenCVTest