tnblog
首页
视频
资源
登录

使用递归算法,递归解析树形结构

12649人阅读 2020/1/10 18:06 总访问:400827 评论:1 收藏:0 手机
分类: .NET Core


在我们做权限管理的树形分布是,前台用的layui 框架,由于当时我们的树形层次只有两级。

试问,假如我们的层次有几十或上百的级的时候,难道我们也用那么多foreach循环吗?显然不科学。

今天我们就用看上去简单,却很实用的递归算法,解析树形结构。

一,新建一个.net core 的mvc项目


新建好项目后,不能像以前一样直接在新建项中添加ef了,需要用命令在添加ef的依赖


注意:所以依赖注入的命令不要放在项目里,要选择放入自己需要生成数据的类库里。



二,需要使用工具的Nuget包管理器添加EF的依赖。

  1. Install-Package Microsoft.EntityFrameworkCore.SqlServer -version 2.1.0


三.如果是使用db first模型,需要根据数据库生成model,就还需要使用命令添加两个依赖

  1. Install-Package Microsoft.EntityFrameworkCore.Tools -version 2.1.0 
  2. Install-Package Microsoft.EntityFrameworkCore.SqlServer.Design

四.相关依赖注入成功之后,就可以再根据一个命令从数据库生成model了

  1. Scaffold-DbContext "Server=.;Database=mydb;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models

  注意:这里的Database=数据库的名称


五.生成数据之后,新建一个tree控制器,实现递归解析


权限sqlserver数据库的层级数据如下:

1,在项目自身的models里新建一个TreeModel类:

  1. namespace WebAppTree.Models
  2. {
  3.     public class TreeModel
  4.     {
  5.         public string id { getset; }
  6.         public string title { getset; }
  7.         public List<TreeModel> children = new List<TreeModel>();
  8.     }
  9. }


2,在tree控制器封装一个递归的方法(需传递三个参数),代码如下:

  1. /// <summary>
  2.         /// 递归函数
  3.         /// </summary>
  4.         public void ParseTree(List<Department> departmentList, List<TreeModel> treeModels,int?  parentId)
  5.         {
  6.             //找当前层级下级(如果ParentId==null 就是第一级)
  7.             List<Department> Result= departmentList.Where(a => a.ParentId == parentId).ToList();
  8.             foreach (Department item in Result)
  9.             {
  10.                 TreeModel treeModel = new TreeModel();
  11.                 treeModel.id = item.Id;
  12.                 treeModel.title = item.DepartmentName;
  13.                 treeModels.Add(treeModel);
  14.                 //递归
  15.                 ParseTree(departmentList,treeModel.children,Convert.ToInt32(treeModel.id));
  16.             }
  17.         }

3,get请求,封装一个返回json数据的方法,代码如下:

  1. [HttpGet]
  2.         public JsonResult GetTreeData()
  3.         {
  4.             mydbContext mydbContexts = new mydbContext();
  5.             List<Department> departmentList = mydbContexts.Department.ToList();
  6.             List<TreeModel> treeModels = new List<TreeModel>();
  7.             ParseTree(departmentList,treeModels,null);
  8.             return Json(treeModels);
  9.         }


4,调试项目的该方法,返回了数据,就说明得到递归方法解析数据成功。


5,现在我们在tree/index,使用layui框架,调用数据,解析明确的树形结构

官网下载layui插件之后,放在wwwroot的lib目录下。



前台调用js,css等,在layui官网复制树形结构图代码,如下;

  1. @{
  2.     ViewData["Title"] = "Index";
  3. }
  4. <link href="~/lib/layui/css/layui.css" rel="stylesheet" />
  5. <script src="~/lib/layui/layui.js"></script>
  6. <script src="~/lib/jquery/dist/jquery.js"></script>
  7. <div id="test12" class="demo-tree-more" style="margin-top:60px;"></div>
  8. <script>
  9.     layui.use(['tree''util'], function ({
  10.         var tree = layui.tree
  11.             , layer = layui.layer
  12.             , util = layui.util
  13.         $.get('/tree/GetTreeData'function (data{
  14.      
  15.         //基本演示
  16.         tree.render({
  17.             elem'#test12'
  18.             , data: data
  19.             , showCheckboxtrue  //是否显示复选框
  20.             , id'demoId1'
  21.             , isJumptrue //是否允许点击节点时弹出新窗口跳转
  22.             , clickfunction (obj{
  23.                 var data = obj.data;  //获取当前点击的节点数据
  24.                 layer.msg('状态:' + obj.state + '<br>节点数据:' + JSON.stringify(data));
  25.             }
  26.             });
  27.         })
  28.     });
  29. </script>


6,绑定数据之后,我们就运行该视图,就可以看到树形解析的层级关系了。


现在大家可以在数据库添加一条 特殊按摩节点下的一条数据,然后刷新页面,就会逐层展开下级啦。


由于我这里数据提前添加了的,所以截图上已经存在该数据,喜欢的朋友可以自己测试哦。

喜欢的话可以加收藏哇,



评价

默认昵称

2021/12/15 15:35:56

 mydbContext mydbContexts = new mydbContext();上下文不存在咋解决


css弹性盒子flex布局

css弹性盒子由于版本不同浏览器问题造成了一些不同的写法display:flexbox;在google浏览器中如果使用下面的写法就不行displa...

可输入下拉文本框据输入动态加载数据 jquery-editable-select

用到一个jquery-editable-select的控件github地址:https://github.com/indrimuska/jquery-editable-select这个插件的原理是...

.net mvc分部页.net core分部页

.net分部页的三种方式第一种:@Html.Partial(&quot;_分部页&quot;)第二种:@{ Html.RenderPartial(&quot;分部页&quot;);}...

css中单位pxemrem和vh/vw的理解

&gt;px像素(Pixel)。相对长度单位。像素px是相对于显示器屏幕分辨率而言的。em是相对长度单位。相对于当前对象内文本的字...

让IIS支持webp格式图片让IIS支持vtt格式iis设置mime类型iis配置支持的类型

webp格式图片可以让图片体积变小。也让下载图片变得更加困难一点 在线制作webp工具 https://www.upyun.com/webp?utm_mediu...

网页上传文件断点续传的实现无视文件大小上传以及datatables基本用法

首先明白js是客户带执行代码,c#是服务器上执行代码。本地文件需要用到js处理,服务器端接受c#代码处理1.HTML页面,文件信...

如何使用图标像使用文字一样使用文本图标的方法

1.首先在Iconfont-阿里巴巴矢量图标库上面找到你需要的图标然后加入你的购物车然后选择图标;注意:每个类型的图标会大小不...

使用七牛云的cdn服务提高图片的加载速度

CDN介绍CDN的全称是Content Delivery Network,即内容分发网络。CDN加速主要是加速静态资源,如网站上面上传的图片、媒体,...

通俗易懂什么是.NET?什么是.NET Framework?什么是.NET Core?

朋友圈@蓝羽 看到一篇文章写的太详细太通俗了,搬过来细细看完,保证你对.NET有个新的认识理解原文地址:https://www.cnblo...

JS监听input、keydown有输入法时打字完成后触发事件

在给输入框绑定input或keydown事件时预期效果是有输入法时,输入中文后触发事件,不希望输一个字母就触发一次事件可以用到c...

修改了css后让浏览器从缓存中更新

当我们修改了css后,如果不做一些操作,浏览器是不会自动更新我们的样式文件的。除非是过期或者用户手动刷新清理缓存等。所...

C MVC RedirectToAction跳转时候传递参数Action之间传值

MVC Action之间传值,页面跳转传值方法一:路由传值很简单直接使用 RedirectToAction(string actionName, string controller...

当你工作遇到以下几种状态时请果断跳槽走人

已经有想跳槽的念头,但是一直磨磨蹭蹭、犹犹豫豫的混日子,这种念头或者一直持续,或者是不是冒出头来占据你的思维了。于...

C与Java二进制编码转换补码

在C#与Java接口对接时,需要将图片转化为二进制编码传输,这时候发现c#转换出来的编码的值是0~255的范围,而java方需要的是...
你之所以觉得时间一年比一年过得快,是因为时间对你一年比一年重要。
排名
13
文章
64
粉丝
20
评论
30
MUI框架页面间的传值指针
XingDy姐 : 不错哦
MUI框架页面间的传值指针
剑轩 : 接口的真实地址可以用xx/yy什么的代替哦,真实地址还是隐藏一下好
.NET EF 用户按钮权限
YOU : 可以,在写文章的时候,有需要写代码的地方,可以选择编辑器上的代...
.NET EF 用户按钮权限
剑轩 : 哈哈哈哈,你这个追女生的逻辑
EF三种模式解析
剑轩 : 好文采!
重要sql语句和linq,lamdba分组条件查询语句
剑轩 : 开头那句诗句写得很好哇!
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术
大本钟下送快递——上面摆,下面寄。