【VUE】.NET实现Tree组件双向绑定数据(2)

写在前面的

   在之前的文章中我们已经做好了前期的准备工作,接下来我们需要做的有两步,第一步是将用户组资源表中的数据读取出来,按照资源页面的级别,拼装树,这个过程我们只涉及到查询;第二步就是根据页面上用户对树资源的勾选和取消勾选,来实现数据库表的添加和删除。

树的拼接

  • 首先我们先来做简单的第一步,我们的基本思路是这样:

    • 1.首先将用户组资源表中的数据与资源表中的数据作对比,同时将页面资源的等级分开,即分为一级节点,二级节点

    • 2.如果用户组拥有该资源则被勾选。即Checked属性为true。(注:如果某个一级节点下的二级节点被勾选的话,那么Tree组件会自动将该一级节点置为勾选状态)

    • 3.如果ParentID为零则表明是一级节点,否则为二级节点

    • 4.将二级节点根据ParentID与一级节点进行对比,添加到一级节点的子节点中。
    • 5.将一级节点设置为“默认展开”的状态,即expand为true。

代码

public IList<CO_RIGHTRESOURCE_QueryParam> GetTreeByID(IList<CO_Right_Resource> nodelist,IList<CV_CO_RIGHT_GROUP_RESOURCE> rightGroupResource) 
{
//由于我无法对原有生成的实体进行更改,所以我创建了"viewmodel"co_rightsource_queryparam实体
//由于controller传来的是另外的两个泛型,所以需要声明一些空list来进行存储
IList<CO_RIGHTRESOURCE_QueryParam> rightResourceList = new List<CO_RIGHTRESOURCE_QueryParam>();
//存储一级节点
IList<CO_RIGHTRESOURCE_QueryParam> firstClass = new List<CO_RIGHTRESOURCE_QueryParam>();
//存储二级节点
IList<CO_RIGHTRESOURCE_QueryParam> secondClass = new List<CO_RIGHTRESOURCE_QueryParam>();
//声明一个根节点,用来存储一级节点;由于页面中的Tree组件所有的值类型是一个对象集合,所以后台向前端返回的值必须是一个list才可以正常显示。
root对象用来添加一级节点
CO_RIGHTRESOURCE_QueryParam root = new CO_RIGHTRESOURCE_QueryParam();
rootTree用来将root节点添加到LIST中,方便前端显示
IList<CO_RIGHTRESOURCE_QueryParam> rootTree = new List<CO_RIGHTRESOURCE_QueryParam>();
//由于我controller中传来的list类型不一致,所以需要重新进行赋值和添加(这个框架真的麻烦,但是这么做也有它的好处)
foreach (var item in nodelist)
{
    CO_RIGHTRESOURCE_QueryParam _tempRightResource = new CO_RIGHTRESOURCE_QueryParam();
    _tempRightResource.ID = item.ID;
    _tempRightResource.Name = item.Name;
    _tempRightResource.Path = item.Path;
    _tempRightResource.Icon = item.Icon;
    _tempRightResource.Access = item.Access;
    _tempRightResource.Title = item.Title;
    _tempRightResource.Component = item.Component;
    _tempRightResource.Sequence = item.Sequence;
    _tempRightResource.ParentID = item.ParentID;
    _tempRightResource.CreatedBy = item.CreatedBy;
    _tempRightResource.CreatedOn = item.CreatedOn;
    _tempRightResource.title = item.Title;
    rightResourceList.Add(_tempRightResource);
}
//将两级节点区分开来
    foreach (var item in rightResourceList)
    {

        foreach (var model in rightGroupResource)
        {
            //如果用户组拥有该资源则被勾选
            if (item.ID == model.ResourceID && item.ParentID!=0)
            {
                item.Checked = "true";
            }
        }
        //如果ParentID为零则表明是一级节点
        if (item.ParentID == 0)
        {
            firstClass.Add(item);
        }
        //否则为二级节点
        else
        {
            secondClass.Add(item);
        }
    }

    //将二级节点根据ParentID与一级节点进行对比,添加到一级节点的子节点中
    foreach (var item1 in firstClass)
    {
        item1.children = new List<CO_RIGHTRESOURCE_QueryParam>();
        foreach (var item2 in secondClass)
        {

            if (item2.ParentID == item1.ID)
            {
                item1.children.Add(item2);
                //将一级节点设置为“默认展开”的状态
                item1.expand = "true";
            }
        }
    }

    //由于页面需要加载一个根目录,所以需要设置根目录属性
    root.title = "页面资源(PageResources)";
    root.expand = "true";
    //将一级节点添加到,根节点中
    root.children = firstClass;
    //在根树中添加root节点
    rootTree.Add(root);
    return rootTree;
    //到了这里,我们的树算是拼装完成了,可以直接返回给controller,再返回给页面就可以正常显示了。
}

总结

   现在我们只是完成了一个树的查询拼接,之后的资源修改才是真正复杂的地方,由于涉及到时间复杂度,再分一篇出来,有兴趣的小伙伴继续关注吧。

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值