JS树型菜单
本树型菜单主要实现功能有:基本的树型菜单,可勾选进行多选项操作。
本树型菜单适合最初级的学者学习,涉及内容不难,下面看代码。
首先看View的代码,第一个<div>用来定义树显示的位置和id
1 <div id="PersonTree"></div> 2 </div> 3 <div style=" margin-left:230px;" id="result"></div> 4 <button class="t-button t-state-default" id="PersonSelectSubmit" onclick="displayCheckedPersons ()">选择人员</button>
接下来看JS代码:
1 $(document).ready(function () { 2 $("#PersonSequenceSubmit").attr('disabled', true); 3 }); 4 $("#PersonTree").jstree({ 5 json_data: { 6 ajax: { 7 url: '<%= Url.Action("GetPersonTreeDataAll", "Home")%>', 8 data: '{did:3}', 9 type: 'POST', 10 dataType: 'json', 11 contentType: 'application/json charset=utf-8' 12 } 13 }, 14 15 "themes": { "theme": "default", "dots": true, "icons": true }, 16 "plugins": ["themes", "json_data", "ui", "checkbox"] 17 }); 18 }); 19 20 var SelectedPersonNum = 0; 21 var SelectedPersons = new Array(); 22 23 function displayCheckedPersons() { 24 var checkedPersons = new Array(); 25 var j; 26 j = 0; 27 var nodes = $("#PersonTree").jstree("get_checked",null,true); //使用get_checked方法 28 $.each(nodes, function (i, element) { 29 if ($(element).attr("ifPerson") == "Y") { 30 checkedPersons[j] = $(element).attr("id"); 31 j = j + 1; 32 } 33 }); 34 35 SelectedPersonNum = checkedPersons.length; 36 if (checkedPersons.length < 1) { 37 alert('请首先选择要管理的工作人员.'); 38 return; 39 } 40 SelectedPersons = checkedPersons; 41 $.ajax({ 42 type: "POST", 43 url: '<%= Url.Action("DisplayCheckedPersons", "Home") %>', 44 data: { checkedRecords: checkedPersons }, 45 dataType: "html", 46 success: function (request) { 47 $("#result").html(request); 48 }, 49 traditional: true 50 }); 51 return; 52 }
上半部分,是用于显示树的,下面的function是用于勾选目标项目进行操作的。这里使用的是ajax形式,不太了解的朋友可以搜搜资料了解下,还是蛮好掌握的。
接下来看后台控制器代码:
1 [HttpPost] 2 public JsonResult GetPersonTreeDataAll(string did)//没用到地点值,显示全部人员,只是保留 3 { 4 5 string classnum = (HttpContext.User.Identity.Name.Split(',')[0]).Substring(0, 0); 6 jstreeDataContext db = new jstreeDataContext(); 7 var d = db.ClassInfo.FirstOrDefault(c => c.classnum == classnum); 8 if (d != null) 9 { 10 JsTreeModel rootNode = new JsTreeModel(); 11 rootNode.attr = new JsTreeAttribute(); 12 rootNode.data = d.classname; 13 rootNode.attr.id = d.classnum; 14 rootNode.state = "open"; //根节点设定为初始打开状态 15 new JsTreeRepository().PopulateTree(classnum, rootNode); 16 return Json(rootNode); 17 } 18 else 19 { 20 return null; 21 } 22 }
这是用于根节点的选取,由第五行获得登录用户的身份并获取该类用户可选操作的根节点,
1 public void PopulateTree(string dhid, JsTreeModel node) 2 { 3 jstreeDataContext db = new jstreeDataContext(); 4 if (node.children == null) 5 { 6 node.children = new List<JsTreeModel>(); 7 } 8 9 var dp = db.ClassInfo.Where(c => c.classnum == dhid).FirstOrDefault(); 10 var dpid = dp == null ? 0 : dp.id; 11 var hid = dp.id; 12 foreach (var d in db.ClassInfo.Where(c => c.classnum.Substring(0, dhid.Length) == dhid & c.classnum.Length == dhid.Length + 3).ToList()) 13 { 14 // create a new node 15 JsTreeModel t = new JsTreeModel(); 16 t.attr = new JsTreeAttribute(); 17 t.attr.id = d.classnum; 18 t.data = d.classname; 19 // populate the new node recursively 20 PopulateTree(d.classnum, t); 21 node.children.Add(t); // add the node to the "master" node 22 } 23 //lastly, loop through each file in the directory, and add these as nodes 24 foreach (var p in db.UsersInfo.Where(e => e.classID == hid).OrderBy(e => e.username).ToList()) 25 { 26 // create a new node 27 JsTreeModel t = new JsTreeModel(); 28 t.attr = new JsTreeAttribute(); 29 t.attr.id = p.usernum; 30 t.attr.ifPerson = "Y"; //表明是人员节点 31 t.data = p.username; 32 t.state = "close"; 33 t.children = null; 34 // add it to the "master" 35 node.children.Add(t); 36 } 37 }
这里,有2个遍历,第一个用于遍历之前传过来的根节点下的所有节点,第二个用于遍历每个节点的叶子。
这里的Model需要注意的一点事:
1 public class JsTreeModel 2 { 3 public string data; 4 public JsTreeAttribute attr; 5 public string state ; 6 public List<JsTreeModel> children; 7 } 8 9 public class JsTreeAttribute 10 { 11 public string id; 12 public string ifPerson = "N"; //初始化都标识不是人员节点 13 } 14 15 public class JsTreeLeafModel 16 { 17 public string data; 18 public JsTreeAttribute attr; 19 }
这是树型菜单需要的一个Model。
好了,剩下的就是数据库和数据元素的Model的建立了,这里就不做多演示了,相信不会难。希望能帮到大家,有不足的望指出。