ASP.MVC EASY UI 入门之 —— Tree & ComboTree
1、常规的EASY UI的tree和comboTree代码基本是官方的DEMO都有的,虽然很简单,但是还是要实践的做一次,才能更清晰的了解和使用它!先上效果图
因为用的是code first,所以数据库的MODEL我是这样做的,这里面注释了许多,是再设计表结构的时候走的弯路和一些备用的东西。
关键的是ID自己的唯一标示,PID是所属的父级,无非就是一个递归表,也就是无极分类表。当然,这是设计的问题。
其次是显示的文字和点击文字后进入的一些操作。这里我只做了一个显示的文字TEXT还有点击文字后进入的相应链接。这里还可以加入显示的图片等内容!
Menu是数据库的结构,但是我们的tree和ComboTree需要的数据并非数据库里原样的数据,所以,我们针对他们需要的数据设计了2个类。
treedata就是他需要的数据的具体形式。其中attribute就是每个节点里需要的具体内容。参考EASYUI的DEMO和文档,我设计的这2个类。
namespace TOM.Model
{
public class Menu
{
[Key]
[Required]
public int ID { get; set; }
public int? PID { get; set; }
[Required]
[MaxLength()]
public string Text { get; set; }
[StringLength()]
public string URL { get; set; } //[ForeignKey("PID")]
//public virtual Menu Parent { get; set; }
//public virtual ICollection<Menu> Children { get; set; }
}
[NotMapped]
public class TreeData
{
//id: An identity value bind to the node.
public string id { get; set; }
//text: Text to be showed.
public string text { get; set; }
//state: The node state, 'open' or 'closed'.
public string state { get; set; }
//iconCls: The css class to display icon.
public string iconCls { get; set; }
//attributes: Custom attributes bind to the node.
public attribute attributes { get; set; }
//pid: string, parent id
public string pid { get; set; }
////checked: Whether the node is checked.
////public string @checked{get;set;}
//[DataMember(Name = "checked")]
//public string ischecked { get; set; }
////attributes: Custom attributes bind to the node.
//public Dictionary<string, object> attributes { get; set; }
//public List<TreeData> children { get; set; }
////target: Target DOM object.
}
[NotMapped]
public class attribute
{
public string url { get; set; }
//other data
}
}
在EASY UI中,应该就是只有异步树的。当然,你如果按照官方要的数据一次性全都查出来,那么就是同步树了。
每个节点都有一个点击事件,每次点击Tree就会默认的Post一个id给后台(当然是异步的时候,如果已经获取到数据了,它就不在POST)。
这里我做了2个事件。onClick事件,获取到的是节点数据。
此外,还有一个onLoadSuccess,这个是完成异步树的过程,它的任务是这样的,默认我们访问后台数据的时候,首先是'/Menu/AsyncTree',仅仅是一个URL,木有参数
[HttpPost]
public JsonResult AsyncTree(int id = 0)
默认的是给0,那么,也就是先把第一级树节点查出来。
然后,当onLoadSuccess相应的时候,它会判断当前的节点是否有子节点(this.state == 'closed' 有子节点的节点,其状态是closed),如果有子节点,通过 t.tree('expandAll');就会展开这个子节点,那么如果这个子节点下的数据未被获取到,Tree就会默认的POST当前节点的id给后台,让后台去加载其子节点数据,相当于代替人工去click子节点。
也就是说,如果我们加入onLoadSuccess事件,并且通过this.state和 t.tree('expandAll')这2个关键操作,就能够实现异步的,一次性全部加载完毕所有的树(递归)。
如果我们不加入onLoadSuccess事件,也是可以的,那就是真正意义和形式上都是异步的。每次点击节点,如果节点状态是'closed',且,其子节点数据并没有加载,那就Tree就会Post一个ID给后台。
//-----------异步树-------------------
$('#AsyncMenu').tree({
url: '/Menu/AsyncTree',
lines: true,
checkbox: true,
//异步树的点击事件
onClick: function (node) {
if (node.attributes == undefined) {
return;
}
if (node.attributes.url && node.attributes.url.length > 0) {
var src = node.attributes.url;
$.messager.alert('提示', '[' + src + ']!', 'info');
}
},
//异步树全部自动展开
onLoadSuccess: function (node, data) {
var t = $(this);
if (data) {
$(data).each(function (index, d) {
if (this.state == 'closed') {
t.tree('expandAll');
}
});
}
}
});
前台的HTML这样写就可以
<fieldset>
<legend>异步树</legend>
<ul id="AsyncMenu"></ul>
</fieldset>
此外,国人也有高手,扩展了这2个组件,使其支持,ID,PID这样的平滑结构。也就是说,不需要递归,只需要把数据全部一次性的读出来,由扩展方法来完成其节点和子节点的关系映射。节约了不少代码,当然,它就不是异步树了。扩展代码如下。
var sy = sy || {};
/**
* 扩展tree和combotree,使其支持平滑数据格式
*
* @author 孙宇
*
* @requires jQuery,EasyUI
*
*/
sy.loadFilter = {
loadFilter : function(data, parent) {
var opt = $(this).data().tree.options;
var idField, textField, parentField;
if (opt.parentField) {
idField = opt.idField || 'id';
textField = opt.textField || 'text';
parentField = opt.parentField || 'pid';
var i, l, treeData = [], tmpMap = [];
for (i = 0, l = data.length; i < l; i++) {
tmpMap[data[i][idField]] = data[i];
}
for (i = 0, l = data.length; i < l; i++) {
if (tmpMap[data[i][parentField]] && data[i][idField] != data[i][parentField]) {
if (!tmpMap[data[i][parentField]]['children'])
tmpMap[data[i][parentField]]['children'] = [];
data[i]['text'] = data[i][textField];
tmpMap[data[i][parentField]]['children'].push(data[i]);
} else {
data[i]['text'] = data[i][textField];
treeData.push(data[i]);
}
}
return treeData;
}
return data;
}
};
$.extend($.fn.combotree.defaults, sy.loadFilter);
$.extend($.fn.tree.defaults, sy.loadFilter);
这样一来,我们使用就相当方便了
//----------Tree扩展方法(非异步,支持【id,pid】格式)--------------- $('#ExtMenu').tree({
url: '/Menu/ExtTree',
//指定父节点字段
parentField: 'pid',
lines: true,
checkbox: true,
//点击事件
onClick: function (node) {
if (node.attributes == undefined) {
return;
}
if (node.attributes.url && node.attributes.url.length > 0) {
var src = node.attributes.url;
$.messager.alert('提示', '[' + src + ']!', 'info');
}
}
});
});
前台HTML代码这样写
<fieldset>
<legend>ComboTree</legend>
<div style="margin: 10px 0">
<a href="javascript:void(0)" class="easyui-linkbutton" onclick="getValue()">GetValue</a>
<a href="javascript:void(0)" class="easyui-linkbutton" onclick="setValue()">SetValue</a>
<a href="javascript:void(0)" class="easyui-linkbutton" onclick="disable()">Disable</a>
<a href="javascript:void(0)" class="easyui-linkbutton" onclick="enable()">Enable</a>
</div>
<select id="ComboTree" class="easyui-combotree" style="width: 200px;"
data-options="url:'/Menu/ExtTree',required:true,parentField: 'pid',value:'1'">
</select>
</fieldset>
辅助的几个JS方法如下:
function getValue() {
var val = $('#ComboTree').combotree('getValue');
$.messager.alert('提示', '[' + val + ']!', 'info');
}
function setValue() {
$('#ComboTree').combotree('setValue', '2');
}
function disable() {
$('#ComboTree').combotree('disable');
}
function enable() {
$('#ComboTree').combotree('enable');
}
后台负责直接把表数据,无脑的都一次性读出来就完事了。
下面附上后台方法。
#region 异步树
[HttpPost]
public JsonResult AsyncTree(int id = )
{
TOM.DAL.MenuRepository d = new TOM.DAL.MenuRepository();
List<TOM.Model.TreeData> list = new List<TOM.Model.TreeData>();
var query = d.List().Where(m => m.PID == id);
foreach (var item in query)
{
TOM.Model.TreeData temp = new TOM.Model.TreeData();
temp.id = item.ID.ToString();
temp.text = item.Text;
temp.state = hasChild(item.ID) ? "closed" : "open";
temp.iconCls = "icon-add";
temp.attributes = new TOM.Model.attribute() { url = item.URL };
list.Add(temp);
}
return Json(list);
}
/// <summary>
/// 判断是否有子节点
/// </summary>
/// <param name="id">父节点ID</param>
/// <returns>Bool</returns>
private bool hasChild(int id)
{
TOM.DAL.MenuRepository d = new TOM.DAL.MenuRepository();
var query = d.List().Where(m => m.PID == id);
return query.Count() > ;
}
#endregion #region 扩展支持{id=0,pid=0}格式的树
[HttpPost]
public JsonResult ExtTree()
{
TOM.DAL.MenuRepository d = new TOM.DAL.MenuRepository();
List<TOM.Model.TreeData> list = new List<TOM.Model.TreeData>();
var query = d.List();
foreach (var item in query)
{
TOM.Model.TreeData temp = new TOM.Model.TreeData();
temp.id = item.ID.ToString();
temp.pid = item.PID.ToString();
temp.text = item.Text;
temp.iconCls = "icon-add";
temp.attributes = new TOM.Model.attribute() { url = item.URL };
list.Add(temp);
}
return Json(list);
}
#endregion
至于后台方法,看看就好了,本人MVC新手,写的不好。此文章也是我备忘用的。如果能给其他人带来方便那是最好的!
最后附图全部效果
ASP.MVC EASY UI 入门之 —— Tree & ComboTree的更多相关文章
- Easy UI 入门
Easy UI常用于企业级开发的UI和后台开发的UI,比较重. 以下组件中的加载方式,属性和事件,方法和组件种类并不全,只是作为参考和入门学习. 1.Draggable(拖动)组件 不依赖其他组件 1 ...
- spring mvc +easy ui +Mybatis 录入数据
1.itemsEasyui.jsp 应用到的插件及知识点:日期控件My97 ,图片本地预览函数PreviewImage() (1)easy ui 的模态窗口使用时,要指定DIV的属性 data-opt ...
- JQuery Easy Ui (Tree树)详解(转)
第一讲:JQuery Easy Ui到底是什么呢? 首先咱们知道JQuery是对Java Script的封装,是一个js库,主要提供的功能是选择器,属性修改和事件绑定等等.. JQuery ui是在j ...
- 玩转Web之easyui(二)-----easy ui 异步加载生成树节点(Tree),点击树生成tab(选项卡)
关于easy ui 异步加载生成树及点击树生成选项卡,这里直接给出代码,重点部分代码中均有注释 前台: $('#tree').tree({ url: '../servlet/School_Tree?i ...
- easy ui Tree请求跨域数据
扯淡篇: jQuery EasyUI为提供了大多数UI控件的使用,如:accordion,combobox,menu,dialog,tabs,validatebox,datagrid,window,t ...
- asp.net core轻松入门之MVC中Options读取配置文件
接上一篇中讲到利用Bind方法读取配置文件 ASP.NET Core轻松入门Bind读取配置文件到C#实例 那么在这篇文章中,我将在上一篇文章的基础上,利用Options方法读取配置文件 首先注册MV ...
- [MVC.NET] Asp.Net MVC3 简单入门第一季
转自:http://www.cnblogs.com/fly_dragon/archive/2011/10/12/2208042.html 初识Asp.Net MVC2.0 初识Asp.Net MVC2 ...
- ASP.NET Core快速入门(第6章:ASP.NET Core MVC)--学习笔记
课程链接:http://video.jessetalk.cn/course/explore 良心课程,大家一起来学习哈! 任务40:介绍 1.Individual authentication 模板 ...
- Jquery easy UI 上中下三栏布局 分类: ASP.NET 2015-02-06 09:19 368人阅读 评论(0) 收藏
效果图: 源代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://w ...
随机推荐
- 密码校验正则表达式(java 环境)
密码校验需求: 1) 密码控制只能输入字母.数字.特殊符号(~!@#$%^&*()_+[]{}|\;:'",./<>?)2) 长度 6-16 位,必须包括字母.数字.特殊 ...
- Silverlight 调用自托管的wcf 报跨域异常的处理
Sileverlight很多时候需要通过wcf和后台,程序进行交互.如果 iis was托管还好,极端的遇到自托管的程序,console,windowsservice,winform,wpf等,就会出 ...
- ubuntu16.04下vim安装失败
问题? 重装了ubuntu系统,安装vim出现了以下问题: sudo apt-get install vim 正在读取软件包列表... 完成 正在分析软件包的依赖关系树 正在读取 ...
- Qt回忆录之配置开发环境
光阴荏苒,用Qt开发已经一年多了.在Windows上开发GUI,最常用的莫过于MFC,WinForm,WPF以及Qt.MFC和Qt是基于C++,而WinForm和WPF一般是基于C#,当然在PC上基于 ...
- 支付宝APP支付开发- IOException : DerInputStream.getLength(): lengthTag=127, too big.
支付宝APP支付Java开发报错: IOException : DerInputStream.getLength(): lengthTag=127, too big. 后来排查是因为没有设置私钥.
- CSS background-position 用法详细介绍
语法: background-position : length || length background-position : position || position 取值: length : ...
- 【简易版】IOS仿periscope自制狂赞飘桃心
periscope自制狂赞飘桃心 国外的IOS app“periscope”非常的火,观看手机视频直播的时候,点击屏幕任何一个地方,屏幕右下角就能飘出各种颜色的桃心,效果非常的炫! 为此我自制了一个仿 ...
- [书目20160624]Android应用开发从入门到精通
卢海东 著 第1章 揭开神秘面纱——Android系统简介 1 1.1 认识Android系统 2 1.1.1 Android成长历程 2 1.1.2 发行版本 3 1.1.3 得到大 ...
- 谈谈Lucene和Solr索引存目录
在Lucene中,有几种索引存放模式呢?用过的人可能记得SimpleFSDirectory.MMapDirectory.NIOFSDirectory.RAMDirectory这四种.新版本的通过FSD ...
- MMORPG大型游戏设计与开发(客户端架构)
首先为所有等待的朋友说一声歉意,实在让大家等的太久.客户端的设计本来就是一个大的工程,而且工作的关系,也没有太多时间在这方面做研究.不过在私下有空的时间,我还是继续着这方面的研究,很遗憾没有用期望的o ...