,我们学习了如何使用zTree对一棵大树(大数据量的树型结构的数据表,呵呵,名称有点绕,但说的是事实)进行异步加载,今天这讲,我们来说说,如何去操作这棵大树,无非就是添加子节点,删除节点,编辑节点,节点之间的拖拽,节点位置的变化(排序)等等。
事实上,jquery.ZTree的demo已经把前台JS代码给的很清晰了,我们只要稍加修改,然后把后台CS代码写好就可以了,我将demo的前台代码做了简单的处理,减化了些代码,项目架构使用microsoft mvc 3.0
前台HTML代码如下:
面各种JS事件,所对应的MVC代码如下:
#region 对节点的操作 ////// 得到一级子节点 /// /// ///public string AsyncGetNodes(int? id) { var model = irepository.GetEntities() .Where(i => i.ParentID == id).OrderBy(i => i.Sortable); return model.ToJson(); } /// /// 添加节点 /// /// /// /// ///public string AsyncAddNodes(int id, string name, int pid) { try { //得到父对象,但设置它的isParent属性 irepository.Modify(i => new Category { ID = pid, IsParent = true, }); var entity = new Category { Name = name, ParentID = pid, CreateDate = DateTime.Now, Level = 1, IsParent = false, }; irepository.Add(entity); return entity.ID.ToString(); } catch (Exception ex) { return ex.Message; } } /// /// 编辑节点(重命名) /// /// /// ///public string AsyncEditNodes(int id, string name) { try { irepository.Modify(i => new Category { ID = id, Name = name, }); return "操作成功"; } catch (Exception ex) { return ex.Message; } } /// /// 删除节点 /// /// ///public string AsyncDelNodes(int id) { try { irepository.Remove(irepository.GetEntity(i => i.ID == id)); return "操作成功"; } catch (Exception ex) { return ex.Message; } } /// /// 拖拽节点 /// /// /// /// ///public string AsyncDragNodes( int id, int pid, string name, string moveType, bool isCopy) { try { var parent = irepository.GetEntity(i => i.ID == pid); var parentSons = irepository.GetEntities(i => i.ParentID == pid); var current = irepository.GetEntity(i => i.ID == id); if (moveType == "inner") parent.isParent = true; else if (parentSons == null || parentSons.Count() == 0) parent.isParent = false; if (isCopy)//复制,前台目前不能实现 { irepository.Add(new Category { ParentID = pid, Name = name, CreateDate = DateTime.Now, }); } else { if (moveType == "inner") { current.ParentID = pid; irepository.Modify(current); } else { current.ParentID = parent.ParentID;//同级移动时,与目标节点父ID相同 current.Sortable = moveType == "next" ? parent.Sortable + 1 : parent.Sortable - 1; irepository.Modify(current); } } irepository.Modify(parent); return "操作成功"; } catch (Exception ex) { return ex.Message; } } #endregion
好了,上面的代码只是对树结果做的最基本的操作,其中拖拽时的复制操作(按着ctrl键,拖拽节点),后台没有进行实现。