栏目递归算法

常见的大型系统如ERP等,都需要动态的栏目,并包含栏目权限等相关功能。

通常在数据库中我们这样保存数据:

174610_eTGJ_2632011.png

在前端显示数据时结构如下:

<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返回前端就搞定了。

欢迎转载,请注明出处^_^

转载于:https://my.oschina.net/xainghu/blog/1501571

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值