zoukankan      html  css  js  c++  java
  • 爱上MVC3~MVC+ZTree大数据异步树加载

    回到目录

    理论部分:

    MVC+ZTree:指在.net MVC环境下进行开发,ZTree是一个jquery的树插件

    大数据:一般我们系统中,有一些表结构属于树型的,如分类,地域,菜单,网站导航等等,而像分类这种表,它的数据量是递增的,不同遇见的,可能几条,几万条,而随着站点的运营,也可能达到几十万条,如果这样的大数据,采用一次读数据到页面的方式,是不可取的,先不说给服务器的压力有多大,只是客户端的浏览器估计就要挂掉,谁愿意加载一个页面等上10多分钟呀,呵呵!

    异步加载:这种方式已经成为主流,异步事实上是指与当前UI线程不冲突,浏览器不会假死,你的获取数据的动作会重新开启一个通道(线程)来与服务器进行通信,而且,这种方式一般是按需去取,ZTree很好的支持了这种方式。

    实例部分:

    首先是为ZTree提供的数据规范,定义一个标准的接口,这样对于前台调用是清楚的,简单的,因为它返回的JSON数据将与ZTree默认的数据元素保持一致

        /// <summary>
        /// ZTree数据结构
        /// </summary>
        public interface IZTree
        {
            /// <summary>
            /// 节点ID
            /// </summar
            int id { get; set; }
            /// <summary>
            /// 节点名称
            /// </summary>
            string name { get; set; }
            /// <summary>
            /// 父ID
            /// </summary>
            int pId { get; set; }
            /// <summary>
            /// 是否有子节点
            /// </summary>
            bool isParent { get; set; }
        }
        public class Node : IZTree
        {
            #region IZTree 成员
            /// <summary>
            /// 节点ID
            /// </summary>
            public int id { get; set; }
            /// <summary>
            /// 节点名称
            /// </summary>
            public string name { get; set; }
            /// <summary>
            /// 父ID
            /// </summary>
            public int pId { get; set; }
            /// <summary>
            /// 是否有子节点
            /// </summary>
            public bool isParent { get; set; }
    
            #endregion
        }

    其次是MVC这边,会前台页面提供一个GET请求的方法,用来根据父ID,得到它的一级子节点列表

            /// <summary>
            /// 得到指定ID的子节点列表,并序列化为JSON串
            /// </summary>
            /// <param name="id"></param>
            /// <returns></returns>
            public string AsyncGetNodes(int? id)
            {
                return nodearr.Where(i => i.pId == (id ?? 0)).ToJson();
            }

    下面是JSON的功能类,网上有很多

        public static class JsonHelper
        {
            /// <summary> 
            /// 返回对象序列化 
            /// </summary> 
            /// <param name="obj">源对象</param> 
            /// <returns>json数据</returns> 
            public static string ToJson(this object obj)
            {
                JavaScriptSerializer serialize = new JavaScriptSerializer();
                return serialize.Serialize(obj);
            }
    
            /// <summary> 
            /// 控制深度 
            /// </summary> 
            /// <param name="obj">源对象</param> 
            /// <param name="recursionDepth">深度</param> 
            /// <returns>json数据</returns> 
            public static string ToJson(this object obj, int recursionDepth)
            {
                JavaScriptSerializer serialize = new JavaScriptSerializer();
                serialize.RecursionLimit = recursionDepth;
                return serialize.Serialize(obj);
            }
    
            public static object ParseFromJson<T>(string szJson)
            {
                T obj = Activator.CreateInstance<T>();
                using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(szJson)))
                {
                    DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
                    return (T)serializer.ReadObject(ms);
                }
            }
        }

    OK,现在我们回到前台,看一下前台页面是如何与后台方法进行通讯的

    <link href="../../Scripts/JQuery-zTree/css/zTreeStyle/zTreeStyle.css" rel="stylesheet" />
    <script src="../../Scripts/JQuery-zTree/js/jquery-1.4.4.min.js"></script>
    <script src="../../Scripts/JQuery-zTree/js/jquery.ztree.all-3.5.min.js"></script>
    <script type="text/javascript">
      //异步加载节点
        var setting4 = {
            data: {
                simpleData: {
                    enable: true,
                    idKey: "id",
                    pIdKey: "pId",
                    rootPId: 0
                }
            },
            async: {
                //异步加载
                enable: true,
                url: "/category/AsyncGetNodes",
                autoParam: ["id", "name", "pId"]
            },
            callback: {
                beforeExpand: beforeExpand,
                onAsyncSuccess: onAsyncSuccess,
                onAsyncError: onAsyncError
            }
        };
    
        function createTree() {
            $.ajax({
                url: '/category/AsyncGetNodes', //url  action是方法的名称
                data: { id: 0 },
                type: 'Get',
                dataType: "text", //可以是text,如果用text,返回的结果为字符串;如果需要json格式的,可是设置为json
                success: function (data) {
                    $.fn.zTree.init($("#treeDemo4"), setting4, eval('(' + data + ')'));
                },
                error: function (msg) {
                    alert(" 数据加载失败!" + msg);
                }
            });
        }
    
    
        function beforeExpand(treeId, treeNode) {
            if (!treeNode.isAjaxing) {
                return true;
            } else {
                alert("zTree 正在下载数据中,请稍后展开节点。。。");
                return false;
            }
        }
    
        function onAsyncSuccess(event, treeId, treeNode, msg) {
    
        }
        function onAsyncError() {
            alert(" 数据加载失败");
        }
    
        $(document).ready(function () {
            createTree();
        });
    </script>

     下面是HTML代码

      <ul id="treeDemo4" class="ztree"></ul>

    好了,我们运行程序,效果就出来了,呵呵!

    经读者提意,放了一个效果图:

    回到目录

  • 相关阅读:
    PHP使用Memcache来存储session 其他【转载】
    Linux 学习记录 20170218
    php 数组去重
    关于php的array_diff和array_diff_assoc的使用总结
    使用谷歌浏览器调试WEB前端的一些必备调试技巧
    MySql 赋值操作符"="与":="
    移动设备检测类Mobile_Detect.php
    PHP Filter 函数 日常可用
    以符合人类阅读的方式打印php数组【转载】
    JavaWeb:HttpSession(一)
  • 原文地址:https://www.cnblogs.com/lori/p/3154139.html
Copyright © 2011-2022 走看看