閱讀目錄
•無限分級
•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
新聞熱點
疑難解答
圖片精選