首页 > 开发 > AJAX > 正文

无限分级和tree结构数据增删改【附DEMO下载】

2024-09-01 08:28:01
字体:
来源:转载
供稿:网友

阅读目录

•无限分级
•jstree插件
•Demo
•创建Region实体
•满足jstree插件的数据对象Dto
•数据转换
•初始化获取转换后的数据
•前台数据加载
•其他操作
•通过按钮来操作增删改

无限分级

很多时候我们不确定等级关系的层级,这个时候就需要用到无限分级了。

说到无限分级,又要扯到递归调用了。(据说频繁递归是很耗性能的),在此我们需要先设计好表机构,用来存储无限分级的数据。当然,以下都是自己捣鼓的结果,非标准。谁有更好的设计望不吝啬赐教。

说来其实也简单,就是一个ID和父ID的关系。

以此类推,Id需要是唯一的,ParenId需要是Id列里面存在即可。这样我们就实现无限分级了,如果再加一列Sort排序就更完美了。

jstree插件

官方地址:https://www.jstree.com/

为什么要用这个插件?因为有方便的api给我们做数据绑定,且支持节点拖动来实现增删改,个人觉得这个功能挺强大的。

Demo

下面我们来基于jstree插件来实现无限分级数据操作。以区域数据操作为例,用Code First的方式来编写demo代码。

创建Region实体

为了配合插件自动生成的节点id,我们这里使用的Node和ParentNode来存储上下级关系(而不是上面说的id和parentid,但是实际效果是一样的)。

/// <summary>/// 区域/// </summary>public class Region{ /// <summary> /// 主键id /// </summary> public int Id { get; set; } /// <summary> /// 名称 /// </summary> public string Name { get; set; } /// <summary> /// 节点 /// </summary> public string Node { get; set; } /// <summary> /// 父节点 /// </summary> public string ParentNode { get; set; }}

满足jstree插件的数据对象Dto

为了适应jstree插件的数据要求,我们需要把上面的数据转换成树状的数据对象。

/// <summary>/// Dto/// </summary>public class RegionsTreeOutput{ /// <summary> /// Id /// </summary> public int RegionsId { get; set; } /// <summary> /// tree显示文本(对应region的name) /// </summary> public string text { get; set; } /// <summary> /// tree的id(对应Node) /// </summary> public string id { get; set; }   /// <summary> /// 子节点数据(此属性就体现的数据的层级关系) /// </summary> public List<RegionsTreeOutput> children { get; set; }}

数据转换

 #region GetRegionTree 初始化数据获取 的辅助方法  public RegionsTreeOutput LoadRegions(string id, List<Region> inRegions, RegionsTreeOutput outRegions)  {   List<Region> regions = inRegions.Where(t => t.ParentNode == id).ToList();   if (outRegions == null)//加载父节点   {    outRegions = ToTreeData(regions[0]);    LoadRegions(outRegions.id, inRegions, outRegions);   }   else//加载子节点   {    outRegions.children = ToTreesData(regions);    if (regions.Count > 0)    {     for (int i = 0; i < regions.Count; i++)     {      LoadRegions(regions[i].Node, inRegions, outRegions.children[i]);//递归调用     }    }   }   return outRegions;  }  public RegionsTreeOutput ToTreeData(Region region)  {   var treeData = new RegionsTreeOutput();   treeData.id = region.Node;   treeData.text = region.Name;   treeData.RegionsId = region.Id;      return treeData;  }  public List<RegionsTreeOutput> ToTreesData(List<Region> listRegion)  {   var regions = new List<RegionsTreeOutput>();   for (int i = 0; i < listRegion.Count; i++)   {    regions.Add(ToTreeData(listRegion[i]));   }   return regions;  }  #endregion             
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表