回到目录

理论部分:

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 ?? )).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>

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

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

回到目录

爱上MVC3~MVC+ZTree大数据异步树加载的更多相关文章

  1. MVC小系列(十四)【MVC+ZTree大数据异步树加载】

    ZTree是一个jquery的树插件可以异步加载 第一步定义一个标准的接口(指的是与ztree默认的数据元素保持一致) /// <summary> /// ZTree数据结构 /// &l ...

  2. MVC+ZTree大数据异步树加载

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

  3. 参考 ZTree 加载大数据量。加载慢问题解析

    参考 ZTree 加载大数据量. 1.一次性加载大数据量加载说明 1).zTree v3.x 针对大数据量一次性加载进行了更深入的优化,实现了延迟加载功能,即不展开的节点不创建子节点的 DOM. 2) ...

  4. 爱上MVC3~MVC+ZTree实现对树的CURD及拖拽操作

    回到目录 上一讲中,我们学习了如何使用zTree对一棵大树(大数据量的树型结构的数据表,呵呵,名称有点绕,但说的是事实)进行异步加载,今天这讲,我们来说说,如何去操作这棵大树,无非就是添加子节点,删除 ...

  5. Ztree异步树加载

    JSP代码片段 <%@ page language="java" contentType="text/html; charset=utf-8" pageE ...

  6. Jquery插件 之 zTree树加载

    原文链接:https://blog.csdn.net/jiaqu2177/article/details/80626730 zTree树加载 zTree 是一个依靠 jQuery 实现的多功能 “树插 ...

  7. [翻译][MVC 5 + EF 6] 7:加载相关数据

    原文:Reading Related Data with the Entity Framework in an ASP.NET MVC Application 1.延迟(Lazy)加载.预先(Eage ...

  8. Angularjs 异步模块加载项目模板

    ng-lazy-module-seed(Angularjs 异步模块加载项目模板) 相信做过SPA项目的朋友都遇到过这个问题:页面初始化时需要加载文件太大或太多了,许多文件加载后很可能不会运行到,这是 ...

  9. hibernate框架学习之数据抓取(加载)策略

    Hibernate获取数据方式 lHibernate提供了多种方式获取数据 •load方法获取数据 •get方法获取数据 •Query/ Criteria对象获取数据 lHibernate获取的数据分 ...

随机推荐

  1. A 浪哥的烦恼 完全背包dp

    https://biancheng.love/contest-ng/index.html#/131/problems 首先,去到n点的最小时间是所有数加起来. 然后,如果我1 --- 2,然后再2-- ...

  2. php 下载图片 文件

    $file = dirname(dirname(__FILE__)) . $_GET['download']; //获取图片的绝对路径 header("Content-type: octet ...

  3. jsp学习--如何定位错误和JSP和Servlet的比较

    一.如何查找JSP页面中的错误  JSP页面中的JSP语法格式有问题,导致其不能被翻译成Servlet源文件,JSP引擎将提示这类错误发生在JSP页面中的位置(行和列)以及相关信息.JSP页面中的JS ...

  4. c#开发Mongo笔记第二篇

    写到第二篇不得不说是我之前犯了一个小错误,其实实现子表存储也是很简单的事,先说我想实现什么样的效果吧 就是用户表里有个成绩字段,成绩字段是个子表 其实实现这个功能也很简单,用面向对象的思想很好理解,子 ...

  5. Eclipse中出现-访问限制由于对必需的库XX具有一定限制,因此无法访问类型

    在项目上点击右键,找到构建路径.然后选择配置配置路径.按如下步骤来配置: 1 点击库选项 2把系统库扩展开来 3点击访问规则 4点击右边的添加按钮 5添加访问规则 6 分辨率设为可访问 7规则模式设为 ...

  6. 【Maven】Eclipse 使用Maven创建SpringMVC Web项目

    创建环境 系统:win 10 软件:eclipse,maven. 创建步骤 创建一个Maven Web项目,可以参照:[Maven]Eclipse 使用Maven创建Java Web项目 添加spri ...

  7. 关于checkbox与文字混排无法对齐的解决方法

    先前代码如下 <span style="vertical-align:middle"><input  type="checkbox" name ...

  8. SQL Server 建表语句

    IF EXISTS(SELECT * FROM sys.Tables WHERE name='stu_info')  DROP TABLE stu_infoGoCreate table stu_inf ...

  9. WPF RichTextBox,关键字搜索,样式改变,超链接替换,图文混排

    RichTextBox 只是一个控件,表示对 FlowDocument 对象执行操作的丰富编辑控件.它所承载的内容由其 Document 属性来呈现. Document 是一个 FlowDocumen ...

  10. commons-logging和log4j

    1.Apache通用日志接口(commons-logging.jar)介绍 Apache Commons包中的一个,包含了日志功能,必须使用的jar包.这个包本身包含了一个Simple Logger, ...