常见的大型系统如ERP等,都需要动态的栏目,并包含栏目权限等相关功能。
通常在数据库中我们这样保存数据:
在前端显示数据时结构如下:
<ul id="tt" class="easyui-tree">
<li>
<span>Folder</span>
<ul>
<li>
<span>Sub Folder 1</span>
<ul>
<li><span><a href="#">File 11</a></span></li>
<li><span>File 12</span></li>
<li><span>File 13</span></li>
</ul>
</li>
<li><span>File 2</span></li>
<li><span>File 3</span></li>
</ul>
</li>
<li><span>File21</span></li>
</ul>
对应的JSON数据格式:
[{
"id":1,
"text":"Folder1",
"iconCls":"icon-save",
"children":[{
"text":"File1",
"checked":true
},{
"text":"Books",
"state":"open",
"attributes":{
"url":"/demo/book/abc",
"price":100
},
"children":[{
"text":"PhotoShop",
"checked":true
},{
"id": 8,
"text":"Sub Bookds",
"state":"closed"
}]
}]
},{
"text":"Languages",
"state":"closed",
"children":[{
"text":"Java"
},{
"text":"C#"
}]
}]
对此,我们有几种实现方式:
1:直接返回列表到前端,由前端格式化数据,转换成树结构。
好处:减轻服务器端压力,在大型系统、高并发、高访问量的系统推荐
2:服务器直接返回json格式化数结构。
好处:数据格式化为树结构更加方便。
这里我使用的是第二种方式:
1:建立Model,Model根据树结构设计。
[DataContract]
public class SubjectModel
{
public SubjectModel()
{
this.iconCls = "icon-save";
this.state = "open";
this.children = new List<SubjectModel>();
}
[DataMember]
public int id { get; set; }
[DataMember]
public string text { get; set; }
/// <summary>
/// icon-save
/// </summary>
[DataMember]
public string iconCls { get; set; }
[DataMember(Name = "checked")]
public bool Checked { get; set; }
/// <summary>
/// closed open
/// </summary>
[DataMember]
public string state { get; set; }
[DataMember]
public List<SubjectModel> children { get; set; }
[DataMember]
public dynamic attributes { get; set; }
}
递归生成树:
public List<SubjectModel> Get_Subject()
{
using (var db = new FineEx.EMS.Model.FineEx_EMSEntities())
{
var subject = db.TM_EMS_Subject.ToList();
List<SubjectModel> subjectmodel = new List<SubjectModel>();
//递归寻找
//绑定一级节点
foreach (var item in subject.Where(s => s.ParentID == 0))
{
SubjectModel sub=CreateChildNodes(subject, item.SubjectID,
new SubjectModel()
{
id = item.SubjectID,
text = item.SubjectNO+"-" + item.SubjectName
});
subjectmodel.Add(sub);
}
{
}
return subjectmodel;
}
}
public SubjectModel CreateChildNodes(List<TM_EMS_Subject> data, int? ParentID, SubjectModel Parent)
{
foreach (var item in data.Where(s => s.ParentID == ParentID))
{
SubjectModel child = new SubjectModel()
{
id = item.SubjectID,
text = item.SubjectNO + "-" + item.SubjectName
};
Parent.children.Add(child);
CreateChildNodes(data, item.SubjectID, child);
}
return Parent;
}
最后在转化为json返回前端就搞定了。
欢迎转载,请注明出处^_^