.Net Mvc 返回Json,动态生成EasyUI Tree
最近做一个项目,开始接触EasyUI,感觉很强大,很适合我这种对前台不是很感冒的人。在学习Tree的过程中,感觉网上的资料挺乱的,很多只是把EasyUI API 抄了一遍。现在把最近这段时间的学到的,给大家分享一下吧,也请大家提意见共同研究。废话不多说了,要实现全动态生成无限级Tree。
1.最终的效果图,可以实现无限分层。

2.数据库表的生成代码:
CREATE TABLE [dbo].[Tree](
[ID] [int] IDENTITY(1,1) NOT NULL,
[CityName] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
[ParentID] [int] NULL,
[State] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
[Url] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
说明:这个是EasyUI tree的数据库表生成代码。对应的字段有ID,CityName,ParentID,State,Url。其中ParentID是父节点ID,Url是指向的页面。
3. EasyUI Tree需要的的数据格式要符合json。根据EasyUI Tree的API 中常用属性,我们来制作.NET中的Model,先来看代码,后面说明。
namespace MvcDemo.Model
{
public class JsonTree
{
private int _id;
private string _text;
private string _state="open";
private Dictionary<string, string> _attributes=new Dictionary<string, string>();
private object _children; public int id
{
get { return _id; }
set { _id = value; }
}
public string text
{
get { return _text; }
set { _text = value; }
}
public string state
{
get { return _state; }
set { _state = value; }
}
public Dictionary<string, string> attributes
{
get { return _attributes; }
set { _attributes = value; }
}
public object children
{
get { return _children; }
set { _children = value; }
}
}
}
说明(从EasyUI 的API中复制):
- id:节点ID,对加载远程数据很重要。
- text:显示节点文本。
- state:节点状态,'open' 或 'closed',默认:'open'。在设置为'closed'的时候,当前节点的子节点将会从远程服务器加载他们。
- attributes: 被添加到节点的自定义属性。(Url属性就在这个里面,用Dictionary可以方便的扩展attribute。)
- children: 一个节点数组声明了若干节点。(这个是子节点,它拥有所有的父节点属性)
children 类型为Object ,如果把children也定义为JsonTree类型,形成嵌套类,但是实例化的时候则会出现死循环问题,一直没有解决,如果哪位知道如何解决,可以给我留言。如果对Object不明白,可以参考微软MSDN。
4. 从数据库得到的DataTable转成成EasyUI所需要的对象结合,下面也是本文的核心代码
namespace MvcDemo.Common
{
public class EasyUITree
{
public List<JsonTree> initTree(DataTable dt)
{
DataRow[] drList = dt.Select("parentid=0");
List<JsonTree> rootNode = new List<JsonTree>();
foreach (DataRow dr in drList)
{
JsonTree jt = new JsonTree();
jt.id = int.Parse(dr["id"].ToString());
jt.text = dr["cityname"].ToString();
jt.state = dr["state"].ToString();
jt.attributes = CreateUrl(dt, jt);
jt.children = CreateChildTree(dt, jt);
rootNode.Add(jt);
}
return rootNode;
} private List<JsonTree> CreateChildTree(DataTable dt, JsonTree jt)
{
int keyid = jt.id; //根节点ID
List<JsonTree> nodeList = new List<JsonTree>();
DataRow[] children = dt.Select("Parentid='" + keyid + "'");
foreach (DataRow dr in children)
{
JsonTree node = new JsonTree();
node.id = int.Parse(dr["id"].ToString());
node.text = dr["cityname"].ToString();
node.state = dr["state"].ToString();
node.attributes = CreateUrl(dt, node);
node.children = CreateChildTree(dt, node);
nodeList.Add(node);
}
return nodeList;
}
private Dictionary<string, string> CreateUrl(DataTable dt, JsonTree jt) //把Url属性添加到attribute中,如果需要别的属性,也可以在这里添加
{
Dictionary<string, string> dic = new Dictionary<string, string>();
int keyid = jt.id;
DataRow[] urlList = dt.Select("id='" + keyid + "'");
string url = urlList[]["Url"].ToString();
dic.Add("url", url);
return dic;
}
}
}
说明:上面这三段代码,最主要的是前两段递归生成树。先生成根节点,然后在依次生成此节点的子节点。CreateUrl方法生成EasyUI Tree所需要的结构。
5.在Controller中调用initTree方法,获得对象集合,然后把集合转变成json对象
public ActionResult JsonTreeTest()
{
EasyUIBLL bll = new EasyUIBLL();
EasyUITree EUItree=new EasyUITree();
DataTable dt = bll.GetTable();
List<JsonTree> list = EUItree.initTree(dt);
var json = JsonConvert.SerializeObject(list); //把对象集合转换成Json
return Content(json);
}
说明:“var json = JsonConvert.SerializeObject(list);” 此步骤需要用 Newtonsoft.Json.dll 下载,使用这个动态连接库,不用再为拼接json字符串而苦恼,可以把更多经历放在逻辑上,注意记得添加引用 “using Newtonsoft.Json;”
6.前台的代码:
$('#tree').tree({
url: '/EasyUI/JsonTreeTest',
checkbox:true
});
前台就采用EasyUI提供的方法。url值就是controller中对应的方法。
7.获得到的Json格式数据: 由于比较长,此处折叠起来了
[
{
"id": 1,
"text": "中国",
"state": "open",
"attributes": {
"url": ""
},
"children": [
{
"id": 2,
"text": "北京",
"state": "open",
"attributes": {
"url": ""
},
"children": [
{
"id": 8,
"text": "海淀区",
"state": "",
"attributes": {
"url": ""
},
"children": []
},
{
"id": 9,
"text": "朝阳区",
"state": "",
"attributes": {
"url": ""
},
"children": []
}
]
},
{
"id": 3,
"text": "上海",
"state": "open",
"attributes": {
"url": ""
},
"children": []
},
{
"id": 4,
"text": "河南",
"state": "open",
"attributes": {
"url": ""
},
"children": [
{
"id": 5,
"text": "郑州",
"state": "open",
"attributes": {
"url": ""
},
"children": []
},
{
"id": 6,
"text": "焦作",
"state": "open",
"attributes": {
"url": ""
},
"children": [
{
"id": 7,
"text": "解放区",
"state": "open",
"attributes": {
"url": ""
},
"children": [
{
"id": 10,
"text": "建设路",
"state": "",
"attributes": {
"url": ""
},
"children": []
}
]
}
]
}
]
}
]
}
]
JsonTree格式代码
8.提示一下,后台所有的转换,都是为了返回EasyUI所需要的Json格式。需要注意的是:Json格式中,所有属性的字母都是小写的,所以在封装JsonTree对象时记得小写,避免不必要的麻烦。
9.由于本人的语言表达能力有限,如果有什么地方没有说明白,可以加我QQ:2413660559 ,也欢迎给我指出文中的错误。
总结:采用这种方式,可以从数据库读取出数据,通过递归生成树形对象,再把树形对象转成Json对象,传递给前台显示,这种方式,代码的整齐度大大提高,面向对象,易于扩展。
转载请标明出处。
.Net Mvc 返回Json,动态生成EasyUI Tree的更多相关文章
- 从数据库读取数据并动态生成easyui tree构结
一. 数据库表结构 二.从后台读取数据库生成easyui tree结构的树 1.TreeNode树结点类(每个结点都包含easyui tree 的基本属性信息) import java.io.Seri ...
- .Net MVC 动态生成LayUI tree
.Net MVC 动态生成LayUI tree 最近在做项目的过程中需要用到Tree插件,所以找了一堆Tree发现LayUI的Tree样式比较好看,所以开始搞! 1.Layui部分 1.1 首先引用文 ...
- spring mvc返回json字符串的方式
spring mvc返回json字符串的方式 方案一:使用@ResponseBody 注解返回响应体 直接将返回值序列化json 优点:不需要自己再处理 步骤一:在spring- ...
- spring mvc返回json字符串数据,只需要返回一个java bean对象就行,只要这个java bean 对象实现了序列化serializeable
1.spring mvc返回json数据,只需要返回一个java bean对象就行,只要这个java bean 对象实现了序列化serializeable 2. @RequestMapping(val ...
- Spring MVC返回json数据给Android端
原先做Android项目时,服务端接口一直是别人写的,自己拿来调用一下,但下个项目,接口也要自己搞定了,我想用Spring MVC框架来提供接口,这两天便抽空浅学了一下该框架以及该框架如何返回json ...
- Spring MVC 返回json数据 报406错误 问题解决方案
将jackson jar包改为jackson-databind-2.5.0.jar jackson-core-2.5.0.jar jackson-annotations-2.5.0.jar(这个版 ...
- 使用spring mvc返回JSON,chrome可以,firefox不行的问题定位
转载http://ks.netease.com/blog?id=4024 作者:李景 场景: 前端Post请求同一个url地址,在chrome浏览器上有正常返回json,而在 ...
- spring mvc返回json格式和json字符串
首先有必要说一下,json和json字符串是不一样的,后者是一个字符串.而json是一个对象 当然如果调用位置是后台程序这几乎没有区别,因为在后台,无论什么格式数据,都是从响应流中读取字符串. 但是在 ...
- spring mvc 返回json的配置
转载自:http://my.oschina.net/haopeng/blog/324934 springMVC-servlet.xml 配置 1 2 3 4 5 6 7 8 9 10 11 12 13 ...
随机推荐
- Win10的Hyper-V虚拟机上安装Ubuntu后显示分辨率问题
分辨率问题 Hyper-V中安装好Ubuntu后,虚拟机显示无法全屏,即使最大化窗口,也只能显示固定大小.即使你尝试更改虚拟机内的屏幕分辨率你也只会发现分辨率选项就只有一个. 解决方法 1.在虚拟机U ...
- HDU - 4535 ZZULI 1867: 礼上往来【错位排序】
1867: 礼上往来 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 216 Solved: 65 SubmitStatusWeb Board Desc ...
- VS中用C#开发应用程序的调试入门、技巧和实例(转载)
入门篇 假设你是有着.Net平台的程序员,并且使用Visual Studio 做为开发工具. 断点:最简单的一种,设置一个断点,程序执行到那一句就自动中断进入调试状态.设置断点,在你觉得有问题的代码行 ...
- 福建工程学院第十四届ACM程序设计大赛 - E - 外传:小晋逃生记
http://www.fjutacm.com/Contest.jsp?cid=705#P4 其实想清楚了就很简单,之前想了很多种方法,以为是二分什么的,看起来就像是一个单峰函数.但是发现直接暴力一波就 ...
- laravel 报错htmlspecialchars() expects parameter 1 to be string, object given
翻译过来就是 期望参数1是字符串 意思就是说变量为数组,应以数组的方式输出 @foreach($xxx as $k=>$y) {{$k}}{{$y}} @endforeach
- [Xcode 实际操作]八、网络与多线程-(20)时间控件Timer定时功能
目录:[Swift]Xcode实际操作 本文将演示时间控件Timer定时功能的使用. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] import UIKit cl ...
- 阿里云物联网 .NET Core 客户端 | CZGL.AliIoTClient:5. 设置设备属性
文档目录: 说明 1. 连接阿里云物联网 2. IoT 客户端 3. 订阅Topic与响应Topic 4. 设备上报属性 4.1 上报位置信息 5. 设置设备属性 6. 设备事件上报 7. 服务调用 ...
- ubuntu 安装R 语言
我个人的环境是 ubuntu 12.04 64 位桌面版. 我自己在安装R 语言时,发现它依赖的库真不是一般的多,所以我在这里简单记录一下我整个安装过程 首先你需要安装 apt-get install ...
- ES6函数参数默认值作用域的模拟原理实现与个人的一些推测
一.函数参数默认值中模糊的独立作用域 我在ES6入门学习函数拓展这一篇博客中有记录,当函数的参数使用默认值时,参数会在初始化过程中产生一个独立的作用域,初始化完成作用域会消失:如果不使用参数默认值,不 ...
- Babel 处理 webpack 无法处理的 ES 语法(Babel 6.x 和 Babel 7.x 有区别)(二)
//这是main.js是我们项目的js入口文件 //1:a导入jQuery,引入jQuery包用$变量接收,此方法与node中 const $ = require('jquery') 同 //此为ES ...