首先来看一下效果

页面加载之初

节点全部展开后

首先数据库的表结构如下

其中Id为主键,PId为关联到自身的外键

两个字段均为GUID形式

层级关系主要靠这两个字段维护

其次需要有一个类型

    public class MenuType{public Guid Id { get; set; }public Guid PId { get; set; }public string MenuName { get; set; }public string Url { get; set; }public int OrderNum { get; set; }public int SonCount { get; set; }}

此类型比数据库表增加了一个属性

SonCount

这个属性用来记录当前节点的子节点的个数

注意:也可以把此属性放在数据库中,性能上会提升一些,但需要增加额外的代码来维护此字段

接下来看一下取数据的方式

        protected void Page_Load(object sender, EventArgs e){if (Request["Action"] == "AJAX"){var result = GetMenu(Request["pid"]);JavaScriptSerializer serializer = new JavaScriptSerializer();string sRet = serializer.Serialize(result);Response.Write(sRet);Response.End();}}

页面加载之初判断是否需要获取菜单数据

其中请求参数pid为客户端需要获取的节点ID

如果请求顶级节点,则此参数的值为00000000-0000-0000-0000-000000000000

GetMenu函数获取需要请求的节点数据

        private List<MenuType> GetMenu(string pid){var result = new List<MenuType>();SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=SHU;User ID=sa;Password=allen;");conn.Open();SqlCommand cmd = new SqlCommand();cmd.Connection = conn;cmd.CommandText = "select a.*,b.cout as count from Menu a left join (select COUNT(*) as cout,Menu.PId from Menu group by Menu.PId) as b on a.Id = b.PId  where a.PId = '" + pid + "' order by OrderNum";SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);while (dr.Read()){var obj = new MenuType();obj.Id =Guid.Parse(dr["Id"].ToString());obj.MenuName = dr["MenuName"].ToString();obj.OrderNum = Convert.ToInt32(dr["OrderNum"]);obj.PId = dr["PId"] == DBNull.Value ? Guid.Empty : Guid.Parse(dr["PId"].ToString());obj.Url = dr["Url"].ToString();obj.SonCount = dr["count"] == DBNull.Value ? 0 : Convert.ToInt32(dr["count"]);result.Add(obj);}return result;}

在本DEMO中使用JavaScriptSerializer来序列化菜单数组

前台的代码如下

<asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent"><link href="Scripts/themes/default/style.css" rel="stylesheet" type="text/css" /><script src="Scripts/jquery.js" type="text/javascript"></script><script src="Scripts/jquery.jstree.js" type="text/javascript"></script><script>$(function () {$.getJSON("/default.aspx?ACTION=AJAX&pid=00000000-0000-0000-0000-000000000000", function (result) {$.each(result, function (i, item) {var typeN = item.SonCount > 0 ? "jstree-closed" : "jstree-leaf";$("#tree").append("<li id='phtml_" + item.Id + "' class='" + typeN + "'><a href='#'>" + item.MenuName + "</a></li>");});$("#demo2").jstree({"plugins": ["themes", "html_data", 'types', "ui", "checkbox"],'core': { 'animation': 0 },"types": { "types":{"person": { "icon": { "image": "/Scripts/themes/default/person.png"} },"depar2": { "icon": { "image": "/Scripts/themes/default/depar2.png"} },"default": { "icon": { "image": "/Scripts/themes/default/depar1.png"} }}}}).bind("open_node.jstree", function (e, data) {var id = data.rslt.obj[0].id;if ($("#" + id + " li").length > 0) { return; }$.getJSON("/default.aspx?ACTION=AJAX&pid=" + id.replace("phtml_", ""), function (result) {var str = "<ul>"$.each(result, function (i, item) {var typeN = item.SonCount > 0 ? "jstree-closed" : "jstree-leaf";var icon = item.SonCount > 0 ? "depar2" : "person";str += "<li rel = '" + icon + "' id='phtml_" + item.Id + "' class='" + typeN + "'><a  href='#'> " + item.MenuName + "</a></li>";});str += "</ul>";$("#" + id).append(str);var tree = jQuery.jstree._reference("#" + id);tree.refresh();$("ins[class='jstree-checkbox jstree-icon']").removeClass("jstree-icon");$(".jstree-checkbox").attr("style", "");});});});});</script>
</asp:Content>
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent"><div id="demo2"><ul id="tree"></ul></div>
</asp:Content>

  

页面加载之初,先请求顶级节点

如果顶级节点的SonCount属性大于0

则使节点为闭合状态(样式为jstree-closed)

如果节点无子节点

则该节点的样式为jstree-leaf

当用户点击闭合状态的节点时,客户端发起请求

并把点击节点的ID传给后端,后端获取到点击节点的子节点后

通过append添加到点击节点下

至此,无限分级的树创建完成

其中不包含数据库

---------------------------------------------------------------------------

喜欢本文的,请点支持,有问题请在本文下评论,我会及时回复的

谢谢大家

使用jstree创建无限分级的树(ajax动态创建子节点)相关推荐

  1. 无限极分类php简单,创建无限极分类树型结构的简单方法

    先上效果图 顶级分类其实就是一级分类,二级分类也叫作一级分类的子分类,在这个基础上,子分类还可以拥有子分类,这样就构成了无限极分类. 接下来看具体实现的代码: 一.在控制器中按字段查询,查询出所有分类 ...

  2. python创建类的实例方法-Python中动态创建类实例的方法

    简介 在Java中我们可以通过反射来根据类名创建类实例,那么在Python我们怎么实现类似功能呢? 其实在Python有一个builtin函数import,我们可以使用这个函数来在运行时动态加载一些模 ...

  3. python动态创建类_Python中通过参数动态创建扩展类(class)

    class Bar: def super_cool_function(self): print("Cool") 1.利用Python闭包动态扩展类 通过在内部创建并从函数返回它来动 ...

  4. java 动态创建实例_java – 有没有办法动态创建类(而不是实例)?

    我有一个关于如何动态创建类(而不是实例)的问题. 在我的项目中,我需要根据配置文件编写几个类似的类. 例如,有一个像这样的 JSON: { { "lang": "pyth ...

  5. kibana创建es索引_java操作es动态创建索引(按月生成),索引类型,索引别名

    第一步:判断索引是否存在: //判断索引是否已经存在String indexName = Constans.ES_INDEX_TIME+"_"+DateUtils.getDateS ...

  6. mysql 递归查找父节点_MySQL递归查询树状表的子节点、父节点具体实现

    简介:mysql5.0.94版本,该版本以及较高级的版本(5.5.6等等)尚未支持循环递归查询,和sqlserver.oracle相比,mysql难于在树状表中层层遍历的子节点.本程序重点参考了下面的 ...

  7. mysql树状结构查询子节点和父节点

    1. 查询父节点: SELECT m.* FROM region m, ( SELECT@r AS _id,( SELECT @r := parent_id FROM region WHERE reg ...

  8. js动态生产html元素,js 动态创建 html元素

    js 动态创建 html元素 js学习之动态创建html元素 body{margin:0;padding:0;} .sky{background:#000;width:1000;height:500p ...

  9. SpringBoot集成Quartz实现定时任务的动态创建、启动、暂停、恢复、删除。

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 作者:毅大师 blog.csdn.net/qq_39648 ...

最新文章

  1. Sharding Sphere 读写分离的配置
  2. Quartus ii与Modelsim-altera 6.5b联调前仿真
  3. 释放锁以及添加线程对于队列的变化
  4. Java EE + MongoDb与Apache TomEE和Jongo Starter项目
  5. 伪代码书写规范_C++代码书写规范(推荐新手程序员)
  6. 给你的网站添加3D地球显示的访客统计(使用RevolverMaps)
  7. VPP /什么是VPP?读这篇文章就够了
  8. POJ3714 Raid 分治/K-D Tree
  9. 交叉熵反向求导计算过程
  10. AD之PCB快速选中所有元器件并锁定
  11. window操作系统安装教程(PE辅助)
  12. matlab绘制三维立体图
  13. uplink端口能接路由器吗_交换机常见的网络故障,你知道如何解决吗?
  14. 性能监控工具-----ServerAgent
  15. Visual Studio C++ 中小微企业信息管理系统设计与实现之开发财务管理系统
  16. 前端如何拥有自己的服务器
  17. 【问题】应用程序池中无Framework v4.0
  18. Linux中在Virtualbox 5.0上安装Windows10
  19. 如何删除金山毒霸的顽固的残留文件?
  20. php 保存Base64图片

热门文章

  1. linux 查看进程
  2. 【IT界的厨子】酱香鲈鱼
  3. 微信分享无响应的解决
  4. 使用DataGridView数据窗口控件,构建用户快速输入体验
  5. 23种设计模式----------代理模式(一)
  6. 一站式 Java Web 框架 firefly-2.0_07发布
  7. mysql zip 安装
  8. 信息学竞赛相关优秀文章合集[持续更新]
  9. 二叉搜索树的插入与删除图解
  10. java日志之slf4j与logback简单使用