树结构类
public class DepartmentNode
{
public int ID { get; set; }
public string Name { get; set; }
public int? ParentID { get; set; }
public DepartmentNode Parent { get; set; }
public int? Order { get; set; }
public ICollection<DepartmentNode> Children { get; set; }
public DepartmentNode(Department department)
{
this.ID = department.ID;
this.Name = department.Name;
this.Order = department.Order;
if (department.Parent != null)
{
this.Parent = new DepartmentNode(department.Parent);
this.ParentID = Parent.ID;
}
}
public DepartmentNode() { }
}
生成树
public DepartmentNode GetDepartmentTree()
{
List<DepartmentNode> nodes = new List<DepartmentNode>();
List<Department> departments = this.repo.GetAll().ToList();
foreach(var dept in departments)
{
var node = new DepartmentNode(dept);
nodes.Add(node);
}
foreach(var node in nodes)
{
if(node.Parent!=null)
{
var child = from n in nodes where n.ParentID == node.ID select n;
node.Children = child.ToList();
}
}
var top = nodes.Where(x=>x.ID==1).Single();
top.Children = nodes.Where( x => x.ParentID==1).ToList();
return top;
}
js解析树
//遍历Json 获取树状菜单
$.getJSON("/Admin/GetDepartmentTree", function (data)
{
var showlist = $("<ul></ul>");
var menu_list = data.Children;
showall(menu_list, showlist);
function showall(menu_list, parent) {
for (var menu in menu_list) {
//如果有子节点,则遍历该子节点
if (menu_list[menu].Children.length > 0) {
//创建一个子节点li
var li = $("<li></li>");
//将li的文本设置好,并马上添加一个空白的ul子节点,并且将这个li添加到父亲节点中
$(li).append(menu_list[menu].Name).append("<ul></ul>").appendTo(parent);
//将空白的ul作为下一个递归遍历的父亲节点传入
showall(menu_list[menu].Children, $(li).children().eq(0));
}
//如果该节点没有子节点,则直接将该节点li以及文本创建好直接添加到父亲节点中
else {
$("<li></li>").append(menu_list[menu].Name).appendTo(parent);
}
}
}
$("#div_menu").append(showlist);
});