.net mvc 构建easyui树形结构
开发背景说明
前端:EasyUI 的 Combotree 组件
后端:.Net MVC
实现思路:其实就是递归,几个foreach循环嵌套而已,就是循环根节点,然后循环根节点的根节点,然后再循环根节点的根节点的根节点,一直如此类推。。。。。。
前端
<div>
<select id="department" class="easyui-combobox"></select>
</div>
//绑定下拉框
$.ajax({
url: "Department/GetDeptCombotreeData",
type: "POST",
dataType: "json",
success: function (res) {
//这里就是最基础的显示,所以只给了data值,还有很多属性自行设置
//eval用来转换成json数组的,不然无法识别
$("#department").combotree({
data: eval(res)
});
}
});
//赋值与取值
function submit(){
//赋值
$('#department').combotree('setValue', '值');
//取值
var selval = $('#department').combobox('getValue');
}
后端
/// <summary>
/// 构造树形Combox下拉框数据
/// </summary>
/// <param name="ParentList">根节点</param>
/// <param name="List">所有节点</param>
/// <returns></returns>
public static List<TreeObject> BindTree(List<TreeObject> ParentList, List<TreeObject> List)
{
List<TreeObject> tree = new List<TreeObject>();
foreach (var item in ParentList)
{
var data = BindTree2(ParentList, List, item.code);
tree.Add(data);
}
return tree;
}
/// <summary>
/// 构造树形Combox下拉框数据2
/// </summary>
/// <param name="ParentList">根节点</param>
/// <param name="List">所有节点</param>
/// <param name="code">根节点id</param>
/// <returns></returns>
public static TreeObject BindTree2(List<TreeObject> ParentList, List<TreeObject> List, string code)
{
//首先要有一个总节点,也就是ParentList,以这些总节点展开,延续后面的子节点,也就是List
TreeObject node = ParentList.Where(t => t.code == code).FirstOrDefault();
if (node != null)
{
//查询这个节点的所有子节点,
List<TreeObject> childTreeNodes = List.Where(t => t.parentcode == code).ToList();
//然后再次进循环,看当前的子节点是否还有子节点
foreach (var child in childTreeNodes)
{
TreeObject n = BindTree2(List, List, child.code);
//返回的对象为null就证明没有子子节点了,直接加上当前子节点
if (n == null)
{
node.children.Add(child);
}
//返回的对象不为null就证明当前节点的子节点还有子子节点,要加上带有子子节点的子节点
else
{
node.children.Add(n);
}
}
}
return node;
}
/// <summary>
/// 树形ComBox下拉框模型
/// </summary>
public class TreeObject
{
public string id { get; set; }
public string text { get; set; }
public string parentid { get; set; }
public List<TreeObject> children = new List<TreeObject>();
}
//使用
[HttpPost]
public ActionResult GetDeptCombotreeData()
{
try
{
using (ManageContext db = new ManageContext())
{
//拿到所有部门
List<DeptInfo> AllDepts = db.DeptInfo.ToList();
//获取最外层的根节点ID
List<string> ParentList = new List<string>();
foreach (var item in AllDepts) {
//查出当前的id是否有父节点
var cc = AllDepts.Where(x => x.Id == item.ParentId).FirstOrDefault();
if (cc == null)
{
ParentList.Add(item.Id);
}
}
//构造最外层的根节点信息
var ParentDeptAll = AllDepts.Where(s => ParentList.Contains(s.Id)).Select(x => new TreeObject
{
id = x.Id.ToString(),
text = x.DeptName,
parentid = x.ParentId
}).ToList();
//构建所有的节点信息
var AllDeptList = AllDepts.Select(x => new TreeObject
{
id = x.Id.ToString(),
text = x.DeptName,
parentid = x.ParentId
}).ToList();
List<TreeObject> tree = BindTree(ParentDeptAll , AllDeptList );
return Json(tree);
}
}
catch (Exception e)
{
throw new Exception(e.Message);
}
}