zoukankan      html  css  js  c++  java
  • .Net Mvc 返回Json,动态生成EasyUI Tree

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

    1.最终的效果图,可以实现无限分层。

    2.数据库表的生成代码:

    1 CREATE TABLE [dbo].[Tree](
    2     [ID] [int] IDENTITY(1,1) NOT NULL,
    3     [CityName] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
    4     [ParentID] [int] NULL,
    5     [State] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
    6     [Url] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL
    7 ) ON [PRIMARY]

    说明:这个是EasyUI tree的数据库表生成代码。对应的字段有IDCityNameParentIDStateUrl。其中ParentID是父节点ID,Url是指向的页面。

    3. EasyUI Tree需要的的数据格式要符合json。根据EasyUI Tree的API 中常用属性,我们来制作.NET中的Model,先来看代码,后面说明。

     1 namespace MvcDemo.Model
     2 {
     3     public class JsonTree
     4     {
     5         private int _id;
     6         private string _text;
     7         private string _state="open";
     8         private Dictionary<string, string> _attributes=new Dictionary<string, string>();
     9         private object _children;        
    10         
    11         public int id
    12         {
    13             get { return _id; }
    14             set { _id = value; }
    15         }
    16         public string text
    17         {
    18             get { return _text; }
    19             set { _text = value; }
    20         }
    21         public string state
    22         {
    23             get { return _state; }
    24             set { _state = value; }
    25         }
    26         public Dictionary<string, string> attributes
    27         {
    28             get { return _attributes; }
    29             set { _attributes = value; }
    30         }
    31         public object children
    32         {
    33             get { return _children; }
    34             set { _children = value; }
    35         }
    36     }
    37 }

    说明(从EasyUI 的API中复制):

    • id:节点ID,对加载远程数据很重要。
    • text:显示节点文本。
    • state:节点状态,'open' 或 'closed',默认:'open'。在设置为'closed'的时候,当前节点的子节点将会从远程服务器加载他们。
    • attributes: 被添加到节点的自定义属性。(Url属性就在这个里面,用Dictionary可以方便的扩展attribute。)
    • children: 一个节点数组声明了若干节点。(这个是子节点,它拥有所有的父节点属性)

        children 类型为Object ,如果把children也定义为JsonTree类型,形成嵌套类,但是实例化的时候则会出现死循环问题,一直没有解决,如果哪位知道如何解决,可以给我留言。如果对Object不明白,可以参考微软MSDN

    4. 从数据库得到的DataTable转成成EasyUI所需要的对象结合,下面也是本文的核心代码

     1 namespace MvcDemo.Common
     2 {
     3      public class EasyUITree
     4     {
     5         public List<JsonTree> initTree(DataTable dt)
     6         {
     7             DataRow[] drList = dt.Select("parentid=0");
     8             List<JsonTree> rootNode = new List<JsonTree>();
     9             foreach (DataRow dr in drList)
    10             {
    11                 JsonTree jt = new JsonTree();
    12                 jt.id = int.Parse(dr["id"].ToString());
    13                 jt.text = dr["cityname"].ToString();
    14                 jt.state = dr["state"].ToString();
    15                 jt.attributes = CreateUrl(dt, jt);
    16                 jt.children = CreateChildTree(dt, jt);
    17                 rootNode.Add(jt);
    18             }
    19             return rootNode;
    20         }
    21 
    22         private List<JsonTree> CreateChildTree(DataTable dt, JsonTree jt)
    23         {
    24             int keyid = jt.id;                                        //根节点ID
    25             List<JsonTree> nodeList = new List<JsonTree>();
    26             DataRow[] children = dt.Select("Parentid='" + keyid + "'");
    27             foreach (DataRow dr in children)
    28             {
    29                 JsonTree node = new JsonTree();
    30                 node.id = int.Parse(dr["id"].ToString());
    31                 node.text = dr["cityname"].ToString();
    32                 node.state = dr["state"].ToString();
    33                 node.attributes = CreateUrl(dt, node);
    34                 node.children = CreateChildTree(dt, node);
    35                 nodeList.Add(node);
    36             }
    37             return nodeList;
    38         }
    39 
    40     
    41         private Dictionary<string, string> CreateUrl(DataTable dt, JsonTree jt)    //把Url属性添加到attribute中,如果需要别的属性,也可以在这里添加
    42         {
    43             Dictionary<string, string> dic = new Dictionary<string, string>();
    44             int keyid = jt.id;
    45             DataRow[] urlList = dt.Select("id='" + keyid + "'");
    46             string url = urlList[0]["Url"].ToString();
    47             dic.Add("url", url);
    48             return dic;
    49         }
    50     }
    51 }

    说明:上面这三段代码,最主要的是前两段递归生成树。先生成根节点,然后在依次生成此节点的子节点CreateUrl方法生成EasyUI Tree所需要的结构。

    5.在Controller中调用initTree方法,获得对象集合,然后把集合转变成json对象

    1         public ActionResult JsonTreeTest()
    2         {
    3             EasyUIBLL bll = new EasyUIBLL();
    4             EasyUITree EUItree=new EasyUITree();
    5             DataTable dt = bll.GetTable();
    6             List<JsonTree> list = EUItree.initTree(dt);
    7             var json = JsonConvert.SerializeObject(list); //把对象集合转换成Json
    8             return Content(json);
    9         }

    说明:“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格式数据:  由于比较长,此处折叠起来了

     1 [
     2     {
     3         "id": 1,
     4         "text": "中国",
     5         "state": "open",
     6         "attributes": {
     7             "url": ""
     8         },
     9         "children": [
    10             {
    11                 "id": 2,
    12                 "text": "北京",
    13                 "state": "open",
    14                 "attributes": {
    15                     "url": ""
    16                 },
    17                 "children": [
    18                     {
    19                         "id": 8,
    20                         "text": "海淀区",
    21                         "state": "",
    22                         "attributes": {
    23                             "url": ""
    24                         },
    25                         "children": []
    26                     },
    27                     {
    28                         "id": 9,
    29                         "text": "朝阳区",
    30                         "state": "",
    31                         "attributes": {
    32                             "url": ""
    33                         },
    34                         "children": []
    35                     }
    36                 ]
    37             },
    38             {
    39                 "id": 3,
    40                 "text": "上海",
    41                 "state": "open",
    42                 "attributes": {
    43                     "url": ""
    44                 },
    45                 "children": []
    46             },
    47             {
    48                 "id": 4,
    49                 "text": "河南",
    50                 "state": "open",
    51                 "attributes": {
    52                     "url": ""
    53                 },
    54                 "children": [
    55                     {
    56                         "id": 5,
    57                         "text": "郑州",
    58                         "state": "open",
    59                         "attributes": {
    60                             "url": ""
    61                         },
    62                         "children": []
    63                     },
    64                     {
    65                         "id": 6,
    66                         "text": "焦作",
    67                         "state": "open",
    68                         "attributes": {
    69                             "url": ""
    70                         },
    71                         "children": [
    72                             {
    73                                 "id": 7,
    74                                 "text": "解放区",
    75                                 "state": "open",
    76                                 "attributes": {
    77                                     "url": ""
    78                                 },
    79                                 "children": [
    80                                     {
    81                                         "id": 10,
    82                                         "text": "建设路",
    83                                         "state": "",
    84                                         "attributes": {
    85                                             "url": ""
    86                                         },
    87                                         "children": []
    88                                     }
    89                                 ]
    90                             }
    91                         ]
    92                     }
    93                 ]
    94             }
    95         ]
    96     }
    97 ]
    JsonTree格式代码

    8.提示一下,后台所有的转换,都是为了返回EasyUI所需要的Json格式。需要注意的是:Json格式中,所有属性的字母都是小写的,所以在封装JsonTree对象时记得小写,避免不必要的麻烦。

    9.由于本人的语言表达能力有限,如果有什么地方没有说明白,可以加我QQ:2413660559 ,也欢迎给我指出文中的错误。

    总结:采用这种方式,可以从数据库读取出数据,通过递归生成树形对象,再把树形对象转成Json对象,传递给前台显示,这种方式,代码的整齐度大大提高,面向对象,易于扩展。

                                              转载请标明出处。

  • 相关阅读:
    java ssl https 连接详解 生成证书
    mysql实战优化之四:mysql索引优化
    mysql实战优化之五: 更新/插入优化 sql优化
    mysql实战优化之六:Order by优化 sql优化、索引优化
    mina2中IoHandler
    I/O通信模型(BIO,NIO,AIO)
    mina框架详解
    转:架构师于小波:魅族实时消息推送架构
    支付业务的数据库表的设计
    实战 TestNG 监听器
  • 原文地址:https://www.cnblogs.com/yonex/p/3379362.html
Copyright © 2011-2022 走看看