jqery easyui 给角色分配菜单 利用tree来实现

cshtml代码

@{
    ViewBag.Title = "Grant";
    string id = ViewBag.id;
}


<div id="tb" style="height:auto;position:absolute; left:10px; top:30px;" >
    <a id="qd" class="easyui-linkbutton" data-options="iconCls:'icon-ok'" onclick="save()">确定</a>
    <a id="qd" class="easyui-linkbutton" data-options="iconCls:'icon-undo'" onclick="javascript:$('#tt').tree('reload')">取消</a>
    @*<a href="javascript:void(0)" class="easyui-linkbutton" data-options="iconCls:'icon-search',plain:true" onclick="getChanges()">GetChanges</a>*@
</div>
<ul id="tt"></ul>

<script type="text/javascript">


        $('#tt').tree({
            url: '/Role/GetTree',
            checkbox: true,  //显示复选框
            lines: true,      //显示树线
            cascadeCheck: true,//级联选择
            onLoadSuccess:function(node,data){granted()},//tree树加载成功后触发 在数据库中展示已有的菜单 默认选中
        });

        function granted() {//查找当前对象已有的权限
            $.ajax({
                url: '/Role/Granted',
                data: { roleId:@id  },
                dataType: 'json',
                type: "POST",
                async: false,
                error: function (d) {

                },
                success: function (d) {
                    if(undefined!=d){
                        for(var i=0;i<d.length;i++){
                            var node =  $('#tt').tree('find',d[i]);
                            $('#tt').tree('check',node.target);
                        }
                    }
                }
            })
        }
    function save() {
        debugger;
            var nodes = $('#tt').tree('getChecked','indeterminate');  
            var listNode = $('#tt').tree('getChecked')
            if (listNode.length==0) {
                utils.message('error','请选择权限!');
                return;
            }
            var checkAllList = new Array();
            for (var i = 0; i < listNode.length; i++) {
                checkAllList.push(listNode[i]);
            }
            for (var i = 0; i < listNode.length; i++) {
                var nodeArray = parentList(listNode[i].target);
                if (nodeArray.length > 0) {
                    for (var j = 0; j < nodeArray.length; j++)
                        checkAllList.push(nodeArray[j])//当前节点的所有祖先节点
                }

            }
            checkAllList = outRepeat(checkAllList);
            var idArray = new Array();
            for (var i = 0; i < checkAllList.length; i++) {
                idArray.push(checkAllList[i].id);
            }
            $.ajax({
                url: '/Role/SaveGrant',
                data: { roleId: @id,navListId: idArray },
                dataType: 'json',
                type: "POST",
                async: true,
                error:function(d){
                    utils.message('error', '保存失败!');
                },
                success: function (d) {
                    if (d == '保存成功') {
                        utils.message('success', d);
                    } else {
                        utils.message('error', d);

                    }
                }
            })

        }
        function parentList(target) {//获得节点的所有祖先节点
            var parentArray = new Array();
            var node = parentNode(target);
            while (undefined != node) {//判断是否还有父节点
                parentArray.push(node);
                node = parentNode(node.target);

            }
            return parentArray;
        }
        function parentNode(target) {//获得节点的父节点
            var node = $('#tt').tree('getParent', target);
            return node;
        }
        function outRepeat(arr) {//数组去重复值得方法
            var new_arr = new Array()
            for (var i = 0; i < arr.length; i++) {
                var items = arr[i];
                //判断元素是否存在于new_arr中,如果不存在则插入到new_arr的最后
                if (!isArrayValueEqual(items, new_arr)) {
                    new_arr.push(items);
                }
            }
            return new_arr;
        }
        function isArrayValueEqual(a, b) {//判断数组中是否有一个对象和此对象相等
            var is = false;
            for (var i = 0; i < b.length; i++) {
                is = isObjectValueEqual(a, b[i]);
                if (is) {
                    return is;
                }
            }
            return is;
        }
        function isObjectValueEqual(a, b) {//判断俩个对象是否相等的方法,比较的是俩个对象的ID值
            var is = a.id == b.id;
            return is;
        }
        //这里做的有点麻烦   开始做的取不到 父级节点 因为父级节点是实心点  没有打对号 所以循环来取
        //后来知道有个方法可以取到  
        var nodes = $('#tt').tree('getChecked','indeterminate');//取实心圆节点的方法

</script>

后台方法

  public ActionResult Granted(string roleId) {
            IList<Navigation> lists = new Navigation().FindAll<Navigation>();//查出所有节点,减少数据库的访问次数
            List<string> navList = new List<string>();

            if (null != roleId) {
                Role role = new Role().FindById<Role>(roleId);
                if (role.Navigations.Count > 0) {
                    foreach (Navigation item in role.Navigations) {//遍历当前角色已有的权限
                        List<TreeNode> treelist =  AllchildNode(item, lists);
                        if (null == treelist || treelist.Count == 0) {
                            navList.Add(item.BaseId);
                        }
                    }
                }
            }
            return this.Json(navList);
        }
        public ActionResult SaveGrant(string roleId , List<string> navListId) {
            string message = "保存成功";
          //  DatasourceFactory.BeginTransaction();
            try
            {
                Role role = new Role().FindById<Role>(roleId);
                if (null != role && null != navListId)
                {
                    role.Navigations = new HashSet<Navigation>();
                    role.Save();
                    foreach (string id in navListId)
                    {

                        Navigation nav = new Navigation().FindById<Navigation>(id);
                        if (null != nav)
                        {
                            role.Navigations.Add(nav);
                        }
                    }
                    role.Save();
                }
            }
            catch (System.Exception e)
            {
                message = "保存失败";
            }
            return this.Json(message);

        }
        public ActionResult Grant(string id) {
            ViewBag.id = id;
            return View();
        }
        public ActionResult GetTree() {
            IList<Navigation> top = new Navigation().GetRootNav();//查找所有根节点
            List<TreeNode> treeGrid = new List<TreeNode>();

            IList<Navigation> lists = new Navigation().FindAll<Navigation>();//查出所有节点,减少数据库的访问次数

            foreach (Navigation na in top) {//遍历所有根节点
                TreeNode node = ObjectConvertNode(na,lists);
                treeGrid.Add(node);
            }
            return Json(treeGrid);
        }
        private TreeNode ObjectConvertNode(Navigation na, IList<Navigation> lists) {//转化成tree树所需要的格式
            TreeNode node = new TreeNode();
            node.id = na.BaseId;
            node.text = na.Name;
           // node.state = "closed";
            node.children = AllchildNode(na,lists);
            //if (null == node.children)
            //{
                node.state = "open";
            //}
            //else {
            //    node.state= "closed";
            //}
            return node;
        }
        private List<TreeNode> AllchildNode(Navigation na, IList<Navigation> lists) {//查找这个节点所有的子节点
            List<Navigation> list = new List<Navigation>();
            List<TreeNode> children = null;
            //获得这个对象的所有子集
            // List<Navigation> nalist = new Navigation().GetQueryabel<Navigation>().Where(t=>t.Parent==na).OrderBy(t=>t.Sequence).ToList();
            List<Navigation> nalist = lists.Where(t => t.Parent == na).OrderBy(t => t.Sequence).ToList();
            if (null != nalist && nalist.Count > 0) {
                children = new List<TreeNode>();
                foreach (Navigation navigation in nalist) {
                    TreeNode node=  ObjectConvertNode(navigation, lists);
                    children.Add(node);
                }
            }
                    return children;
        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值