C#/asp.net实现异步加载zTree目录节点,提供搜索zTree节点功能

zTree异步加载目录

前言

虽然工作了5年多了,但是这还是第一次发表文章,有点惭愧,作为一个程序猿,感觉有点不合格,哈哈哈。前端js框架用的angularJS,后台C#简单的查询,返回的主要是json字符串。有问题大家留言有时间一起研究研究吧。

具体实现

样式图片:
在这里插入图片描述

代码

angularJS:

	//目录树参数配置 用两个setting是因为搜索节点的时候用的是非异步的,
    var Modelsetting = {//非异步
        data: {
            simpleData: {
                enable: true,//表示使用简单数据模式
                idKey: "id",//设置之后id为在简单数据模式中的父子节点关联的桥梁
                pidKey: "pId",//设置之后pid为在简单数据模式中的父子节点关联的桥梁和id互相对应
                rootId: "null"//pid为null的表示根节点
            }
        },
        view: {
            expandSpeed: ""
        }
    }
    var ModelsettingAsync = {//异步setting
        async: {
            autoParam: ["parentId"],
            enable: true,
            type: "post",
            url: "/api/Home/GetNodes",
            dataFilter: filter,
        },
        data: {
            simpleData: {
                enable: true
            }
        },
        view: {
            expandSpeed: ""
        },
        callback: {
            onAsyncSuccess: zTreeOnAsyncSuccess
        }
    }
    
	function filter(treeId, parentNode, childNodes) {
        if (!childNodes) return null;
        return childNodes;
    }
    
    function zTreeOnAsyncSuccess(event, treeId, treeNode, msg) {
        if (!msg || msg.length == 0) {
            return; 
        }
        var url = "/api/Home/GetNodes?&parentId=";
        if (treeNode == undefined) {
            return;
        }
        else {
            url += treeNode.id;
        }
        $.ajax({
            type: "post",
            url: url,
            data: "",
            dataType: "json",
            async: true,
            success: function (jsonData) {
                if (jsonData) {
                    var d = parseData(jsonData);
                    if (d.success == true) {
                        var data = parseData(d.list);
                        var treeObj = $.fn.zTree.getZTreeObj("treeHomeDemo");
                        if (data != null && data.length != 0) {
                            if (treeNode == undefined) {
                                treeObj.addNodes(null, data, true);// 如果是根节点,那么就在null后面加载数据
                            }
                            else {
                                treeObj.addNodes(treeNode, data, true);//如果是加载子节点,那么就是父节点下面加载
                            }
                        }
                        treeObj.expandNode(treeNode, true, false, false);// 将新获取的子节点展开
                    }
                }
            },
            error: function () {
                alert("请求错误!");
            }
        });
    };

	//程序加载的时候执行这个方法
	$this.getTreeListAsync = function () {
        try {
            var url = "/api/Home/GetNodes?parentId=0";//默认加载第一个层级
            //也可以用$.ajax()
            $http({
                method: "post",
                async: true,
                cache: false,
                url: url
            }).success(function (data) {
                if (data) {
                    var d = parseData(data);
                    if (d.success == true) {
                        var result = parseData(d.list);
                        if (result.length > 0) {
                            $.fn.zTree.init($("#treeHomeDemo"), ModelsettingAsync, result);
                            //默认展开根节点
                            var treeObj = $.fn.zTree.getZTreeObj("treeHomeDemo");
                            if (null != treeObj) {
                                var nodes = treeObj.getNodes();
                                if (nodes.length > 0) {
                                    for (var i = 0; i < nodes.length; i++) {
                                        treeObj.expandNode(nodes[i], true, false, false);
                                    }
                                }
                            }
                        }
                    }
                }
            }).error(function (data) {
                console.log(data);
            })
        } catch (e) {
        }
    }

	$this.allSorts = [];
    $this.getTreeListBySearch = function (treeid) {
        if ($this.allSorts.length == 0) {
            $.ajax({
                type: "get",
                async: false,
                url: "/api/Home/GetAllNodes",
                success: function (data) {
                    if (data) {
                        var d = parseData(data);
                        if (d.success == true) {
                            $this.allSorts = parseData(d.list);
                        }
                    }
                },
                error: function (data) {
                    console.log(data);
                }
            });
        }

        $.fn.zTree.init($("#" + treeid), Modelsetting, $this.allSorts);
    }

	//treeNodeId = ul的id
    $this.searchNode = function (treeNodeId) {
        var value = $.trim($("#searchValue").val());
        if (value == "") {
            $this.getTreeListAsync();
            return;
        }
        //搜索具体的目录的时候用的是非异步的方式,因为root.search_ztree需要所有的节点,所以需要先把所有的节点都给加载出来
        $this.getTreeListBySearch(treeNodeId);
        root.search_ztree(treeNodeId, "searchValue")
    }

    var inputArea = $("input[name='searchArea']");
    inputArea.keyup(function (treeId, treeNode, e) {
        var e = event || window.event;
        var val = inputArea.val();
        if (e.keyCode == 13 || val == "") {
            $this.searchNode("treeHomeDemo");
            $(".clearBtn").css("visibility","hidden");
        }
        if (val) {
            $(".clearBtn").css("visibility", "visible");
        }
    });

    $this.clearValue = function () {
        inputArea.val('');
        $(".clearBtn").css("visibility", "hidden");
        $this.searchNode("treeHomeDemo");
    }    

	var root = {
	search_ztree: function(treeId, searchConditionId) {
        searchByFlag_ztree(treeId, searchConditionId, "");
    }
}

//下面几个方法是从别的地方copy过来的,具体地址我也没引用了,抱歉
/**
 * 搜索树,高亮显示并展示【模糊匹配搜索条件的节点s】
 * @param treeId
 * @param searchConditionId     搜索条件Id
 * @param flag                  需要高亮显示的节点标识
 */
function searchByFlag_ztree(treeId, searchConditionId, flag) {
    //<1>.搜索条件
    var searchCondition = $.trim($('#' + searchConditionId).val());
    //<2>.得到模糊匹配搜索条件的节点数组集合
    var highlightNodes = new Array();
    if (searchCondition != "") {
        var treeObj = $.fn.zTree.getZTreeObj(treeId);
        highlightNodes = treeObj.getNodesByParamFuzzy("name", searchCondition, null);
    }
    //<3>.高亮显示并展示【指定节点s】
    highlightAndExpand_ztree(treeId, highlightNodes, flag);
}

/**
 * 高亮显示并展示【指定节点s】
 * @param treeId
 * @param highlightNodes 需要高亮显示的节点数组
 * @param flag           需要高亮显示的节点标识
 */
function highlightAndExpand_ztree(treeId, highlightNodes, flag) {
    var treeObj = $.fn.zTree.getZTreeObj(treeId);
    //<1>. 先把全部节点更新为普通样式
    var treeNodes = treeObj.transformToArray(treeObj.getNodes());
    for (var i = 0; i < treeNodes.length; i++) {
        treeNodes[i].highlight = false;
        treeObj.updateNode(treeNodes[i]);
    }
    //<2>.收起树, 只展开根节点下的一级节点
    close_ztree(treeId);
    //<3>.把指定节点的样式更新为高亮显示,并展开
    if (highlightNodes != null) {
        for (var i = 0; i < highlightNodes.length; i++) {
            if (flag != null && flag != "") {
                if (highlightNodes[i].flag == flag) {
                    //高亮显示节点,并展开
                    highlightNodes[i].highlight = true;
                    treeObj.updateNode(highlightNodes[i]);
                    //高亮显示节点的父节点的父节点....直到根节点,并展示
                    var parentNode = highlightNodes[i].getParentNode();
                    var parentNodes = getParentNodes_ztree(treeId, parentNode);
                    treeObj.expandNode(parentNodes, true, false, true);
                    treeObj.expandNode(parentNode, true, false, true);
                }
            } else {
                //高亮显示节点,并展开
                highlightNodes[i].highlight = true;
                treeObj.updateNode(highlightNodes[i]);
                //高亮显示节点的父节点的父节点....直到根节点,并展示
                var parentNode = highlightNodes[i].getParentNode();
                var parentNodes = getParentNodes_ztree(treeId, parentNode);
                treeObj.expandNode(parentNodes, true, false, true);
                treeObj.expandNode(parentNode, true, false, true);
            }
        }
    }
}

/**
 * 递归得到指定节点的父节点的父节点....直到根节点
 */
function getParentNodes_ztree(treeId, node) {
    if (node != null) {
        var treeObj = $.fn.zTree.getZTreeObj(treeId);
        var parentNode = node.getParentNode();
        return getParentNodes_ztree(treeId, parentNode);
    } else {
        return node;
    }
}

/**
 * 设置树节点字体样式
 */
function setFontCss_ztree(treeId, treeNode) {
    if (treeNode.id == 0) {
        //根节点
        return { color: "#333", "font-weight": "bold" };
    } else if (treeNode.isParent == false) {
        //叶子节点
        return (!!treeNode.highlight) ? { color: "#ff0000", "font-weight": "bold" } : { color: "#660099", "font-weight": "normal" };
    } else {
        //父节点
        return (!!treeNode.highlight) ? { color: "#ff0000", "font-weight": "bold" } : { color: "#333", "font-weight": "normal" };
    }
}

页面布局:

<div class="be_content scroll-cont-auto">
	<div class="be_item_group searchGroup">
        <div class="btn-group pull-left">
            <input type="text" class="btn-group searchText" placeholder="" name="searchArea" id="searchValue" autocomplete="off"/>
            <i class="clearBtn glyphicon glyphicon-remove" ng-click="clearValue()" style="visibility: hidden;"></i><!--删除的×号默认是隐藏的,输入文字后显示-->
            <i class="searchAreaBtn glyphicon glyphicon-search" ng-click="searchNode('treeHomeDemo')"></i>
        </div>
    </div>
    <div class="be_line be_pd10 dark">
        <ul id="treeHomeDemo" class="ztree"></ul>
    </div>
</div>

C#后台:(我觉的java后台什么的都行,只要返回对应格式的数据给前端就行了)

		[HttpPost("GetNodes")]
        public string GetNodes(int? parentId)
        {
            if(parentId == null)
            {
                return "";
            }
            string sql = "SELECT CategoryID,ParentCode,IsEnd,LevelName,CodeName FROM nodes where usable = 0 and parentcode = " + parentId + " order by levelname ";
            
            DataTable dt = DB.GetTable(sql);
            List<sys_device> dsList = new List<sys_device>();
            if (parentId == 0)
            {
                dsList.Add(new sys_device()
                {
                    id = 0,
                    pId = 0,
                    name = "目录总层级",
                    isParent = true
                });
            }
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                dsList.Add(new sys_device()
                {
                    id = Convert.ToInt32(dt.Rows[i]["CategoryID"]),
                    pId = Convert.ToInt32(dt.Rows[i]["ParentCode"]),
                    isEnd = Convert.ToInt32(dt.Rows[i]["IsEnd"]),
                    name = dt.Rows[i]["LevelName"].ToString(),
                    codename = dt.Rows[i]["CodeName"].ToString(),
                    isParent = Convert.ToInt32(dt.Rows[i]["IsEnd"]) == 0//似乎必须要
                });
            }
            res.list = JsonHelper.Instance.Serialize(dsList);
            res.success = true;
            res.msg = "查询成功";
            return JsonOperate.ObjToJson<ResponseEntity>(res);
        }
        [HttpGet("GetAllNodes")]
        public string GetAllNodes()
        {
            string sql = "SELECT CategoryID,ParentCode,IsEnd,LevelName,CodeName FROM node where usable = 0  order by levelname ";

            DataTable dt = DB.GetTable(sql);
            List<sys_device> dsList = new List<sys_device>();
            dsList.Add(new sys_device()
            {
                id = 0,
                pId = 0,
                name = "目录总层级",
                isParent = true
            });
            for (int i = 0; i < dt.Rows.Count; i++)
            {
                dsList.Add(new sys_device()
                {
                    id = Convert.ToInt32(dt.Rows[i]["CategoryID"]),
                    pId = Convert.ToInt32(dt.Rows[i]["ParentCode"]),
                    isEnd = Convert.ToInt32(dt.Rows[i]["IsEnd"]),
                    name = dt.Rows[i]["LevelName"].ToString(),
                    codename = dt.Rows[i]["CodeName"].ToString(),
                    isParent = Convert.ToInt32(dt.Rows[i]["IsEnd"]) == 0
                });
            }
            res.list = JsonHelper.Instance.Serialize(dsList);
            res.success = true;
            res.msg = "查询成功";
            return JsonOperate.ObjToJson<ResponseEntity>(res);
        }
	public class sys_device
    {
        public int id { get; set; }
        public int mocode { get; set; }
        public int categoryId { get; set; }
        public int pId { get; set; }
        public int isEnd { get; set; }
        public string name { get; set; }
        public string codename { get; set; }
        public bool isParent { get; set; }
    }
	public class ResponseEntity
    {
        public bool success = false;
        public string msg;
        public string list;
        public int row;
        public int index;
        public int total;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值