如何构造tree数据结构,做个笔记,方便查阅,本方法是直接返回json字符串:
1private string ToMenuJson(List<Model> data, string parentId) 2 { 3 var sbJson = new StringBuilder(); 4 sbJson.Append("["); 5 var entitys = data.FindAll(t => t.ParentID == parentId).ToList(); 6 if (entitys.Count > 0) 7 { 8 foreach (var item in entitys) 9 { 10 var strJson = JsonConvert.SerializeObject(item, new JsonSerializerSettings { ReferenceLoopHandling = ReferenceLoopHandling.Ignore }); 11 strJson = strJson.Insert(strJson.Length - 1, ",\"ChildNodes\":" + ToMenuJson(data, item.ID) + ""); 12 sbJson.Append(strJson + ","); 13 } 14 sbJson = sbJson.Remove(sbJson.Length - 1, 1); 15 } 16 sbJson.Append("]"); 17 return sbJson.ToString(); 18 }
本方法是构造tree实体,返回实体:
1/// <summary> 2 /// 绑定列表递归方法 3 /// </summary> 4 /// <param name="ddl">构造tree数据结构返回的实体</param> 5 /// <param name="menus">绑定的数据源</param> 6 /// <param name="categoryid">父级id值</param> 7 private void BindChannelType(List<ECategoryModel> ddl, List<ECategory> menus, Guid categoryid) 8 { 9 List<ECategory> filterMenu = menus.Where(w => w.ParentID == categoryid).ToList(); 10 11 foreach (var m in filterMenu) 12 { 13 var mextend = new ECategoryModel 14 { 15 ID = m.ID, 16 ParentID = m.ParentID, 17 CategoryName = m.CategoryName, 18 URL = m.URL, 19 Sort = m.Sort, 20 IsDelete = m.IsDelete 21 }; 22 ddl.Add(mextend); 23 BindChannelType(mextend.children, menus, m.ID); 24 } 25 }
构造树形数据(带空格和缩进):
1/// <summary> 2 /// 构造树形下拉框数据结构 3 /// </summary> 4 private void Generate(List<ECategoryModel> viewList, List<ECategory> categories, Guid categoryid, int i = 0) 5 { 6 i++; 7 var filterMenu = categories.Where(w => w.ParentID == categoryid).OrderBy(w => w.Sort).ToList(); 8 9 foreach (var m in filterMenu) 10 { 11 var str = ""; //父级菜单不缩进 for (var j = 1; j < i; j++) { str += HttpUtility.HtmlDecode(" ") + "├"; } 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:
1using System; 2using System.Collections.Generic; 3 4namespace MSEduPlatform.Models 5{ 6 /// <summary> 7 /// ECategory表实体类 8 /// </summary> 9 public class ECategoryModel 10 { 11 /// <summary> 12 /// 菜单ID 13 /// </summary> 14 public Guid ID { get; set; } 15 16 /// <summary> 17 /// 父级菜单ID 18 /// </summary> 19 public Guid ParentID { get; set; } 20 21 /// <summary> 22 /// 菜单Code 23 /// </summary> 24 public string Code { get; set; } 25 26 /// <summary> 27 /// 菜单名称 28 /// </summary> 29 public string CategoryName { get; set; } 30 31 /// <summary> 32 /// 菜单地址 33 /// </summary> 34 public string URL { get; set; } 35 36 /// <summary> 37 /// 菜单排序 38 /// </summary> 39 public int Sort { get; set; } 40 41 /// <summary> 42 /// 显示状态 43 /// </summary> 44 public int States { get; set; } 45 46 /// <summary> 47 /// 栏目权限类别 48 /// </summary> 49 public string AuthorizationType { get; set; } 50 51 /// <summary> 52 /// 是否授权 53 /// </summary> 54 public bool IsAuthorization { get; set; } 55 56 /// <summary> 57 /// 创建人 58 /// </summary> 59 public Guid Creater { get; set; } 60 61 /// <summary> 62 /// 创建时间 63 /// </summary> 64 public DateTime CreateTime { get; set; } 65 66 /// <summary> 67 /// 修改人 68 /// </summary> 69 public Guid Modify { get; set; } 70 71 /// <summary> 72 /// 修改时间 73 /// </summary> 74 public DateTime ModifyTime { get; set; } 75 76 /// <summary> 77 /// 是否逻辑删除 78 /// </summary> 79 public int IsDelete { get; set; } 80 81 /// <summary> 82 /// 子数据列表 83 /// </summary> 84 public List<ECategoryModel> children = new List<ECategoryModel>(); 85 } 86}