期货大赛项目|五,表格插件datatatables在MVC中的应用
系统中都需要表格,我见过最好的表格就是Datatables了,但中文文档有限,英文能力有限,就写一些简单用法
上图看效果先
要了分页和排序
基本用法
引入js和css
bundles.Add(new ScriptBundle("~/bundles/datatablesJs").Include(
"~/Content/vendors/datatables.net/js/jquery.dataTables.min.js",
"~/Content/vendors/datatables.net-bs/js/dataTables.bootstrap.min.js",
"~/Content/vendors/iCheck/icheck.min.js",
"~/Scripts/datatables.helper.js")); bundles.Add(new StyleBundle("~/Content/vendors/datatables.net-bs/css/datatablesCss1").Include(
"~/Content/vendors/datatables.net-bs/css/dataTables.bootstrap.min.css")); bundles.Add(new StyleBundle("~/Content/vendors/iCheck/skins/flat/datatablesCss2").Include(
"~/Content/vendors/iCheck/skins/flat/green.css"));
html
<table id="usertable" class="table table-striped table-bordered">
<thead>
<tr>
<th><input type="checkbox" id="check-all"></th>
<th>序号</th>
<th>登录名</th>
<th>昵称</th>
<th>有效状态</th>
<th>创建时间</th>
<th>修改时间</th>
</tr>
</thead>
</table>
js
var $datatable = $("#usertable");
var $btnadd = $("#btn_add");
var $btndel = $("#btn_del");
var $btnmodify = $("#btn_modify");
var $myaddmodal = $("#myAddModal");
var $mymodifymodal = $("#myModifyModal");
var $formadd = $("#form_add");
var $formmodify = $("#form_modify");
var $submitadd = $("#submit_add");
var $submitmodify = $("#submit_modify");
var $modifyId = $("#MId"); //---------------------datatables表格初始化----------------
var tbl = $datatable.DataTable({
"ajax": {
"url": "/Admin/Back/GetDatas",
"data": function (data) {
return JSON.stringify(data);
}
},
"columns": [
{ "data": "Id" },
{ "data": null },
{ "data": "Account" },
{ "data": "NickName" },
{ "data": "IsEnabled" },
{ "data": "AddTime" },
{ "data": "LastTime" }
],
'columnDefs': [
{
targets: [0],
"render": function (data, type, full, meta) {
return '<input type="checkbox" name="checklist" value="' + data + '" />';
},
"bSortable": false
},
{
targets: [1],
"render": function (data, type, full, meta) {
return meta.row + 1;
},
"bSortable": false
},
{
targets: [4],
"render": function (data, type, full, meta) {
return get_enabled(data);
}
},
{
targets: [5, 6],
"render": function (data, type, full, meta) {
return moment(data).format("YYYY-MM-DD HH:mm:ss");
}
}
]
}); //tbl.order([6, 'desc']).draw(); //绘制表格事件
$datatable.on("draw.dt", function () {
turn_on_icheck();
check_all();
});
$datatable.DataTable就是表格的初始化
"data": function (data) {
return JSON.stringify(data);
}
保证了传入的参数为json格式
'columnDefs': [
{
targets: [0],
"render": function (data, type, full, meta) {
return '<input type="checkbox" name="checklist" value="' + data + '" />';
},
"bSortable": false
},
{
targets: [1],
"render": function (data, type, full, meta) {
return meta.row + 1;
},
"bSortable": false
}
]
columnDefs是列渲染
[0]代表第一列,代码将第一页渲染成了checkbox,将第二页渲染成了自增列(只是本页自增)
"bSortable": false 表示该列不排序
这样当然是不够的,因为我们没有看到datatables的配置项都在哪,是因为我把它封装了
$.extend($.fn.dataTable.defaults, {
"processing": true,//加载中
"ordering": true, // 是否开启排序功能(默认开启)
"order": [[0, "asc"]], // 设置默认排序的表格列[参数1是表格列的下标,从0开始]
"serverSide": true,//服务器模式(★★★★★重要,本文主要介绍服务器模式)
"searching": false,//datatables自带的搜索
"ajax": {
"type": "POST",//(★★★★★重要)
"contentType": "application/json; charset=utf-8"
},
"language": {
"processing": "加载中...",
"lengthMenu": "每页显示 _MENU_ 条数据",
"zeroRecords": "没有匹配结果",
"info": "显示第 _START_ 至 _END_ 项结果,共 _TOTAL_ 项",
"infoEmpty": "显示第 0 至 0 项结果,共 0 项",
"infoFiltered": "(由 _MAX_ 项结果过滤)",
"infoPostFix": "",
"search": "搜索:",
"url": "",
"emptyTable": "没有匹配结果",
"loadingRecords": "载入中...",
"thousands": ",",
"paginate": {
"previous": "上一页",
"next": "下一页"
}
}
}); function get_enabled(parameters) {
if (parameters === 1) {
return "有效";
} else {
return "已禁用";
}
} //渲染页面所有的checkbox为icheck
function turn_on_icheck() {
$("input[type=checkbox]").iCheck({
checkboxClass: "icheckbox_flat-green"
});
} //全选
function check_all() {
var $checkboxAll = $("#check-all"),
$checkbox = $("tbody").find("[type='checkbox']"); $checkboxAll.on('ifClicked', function (event) {
if (event.target.checked) {
$checkbox.iCheck("uncheck");
} else {
$checkbox.iCheck("check");
}
});
}
这里我将checkbox渲染成了一个icheck,还有全选,这些都需要在绘制datatables事件中完成
//绘制表格事件
$datatable.on("draw.dt", function () {
turn_on_icheck();
check_all();
});
OK,前端搞定,看看后台吧
后台
[HttpPost]
public JsonResult GetDatas(DataTablesParameters query)
{
var totalCount = ;
var result = _bll.QueryPage(GetLamada(query.OrderBy), (int)query.OrderDir, query.Start, query.Length, ref totalCount).ToList();
var viewResult = result.ToModelList();
var resultJson = new DataTablesResult<UserViewModel>(query.Draw, totalCount, totalCount, viewResult);
return Json(resultJson);
}
可以看到,传入的参数也被我封装了,因为datatables会固定传入一些值
封装类DataTablesParameters
using System.Collections.Generic;
using System.Linq; namespace FuturesContest.ViewModel.DataTables
{
public class DataTablesParameters
{
/// <summary>
/// 请求次数计数器
/// </summary>
public int Draw { get; set; } /// <summary>
/// 第一条数据的起始位置
/// </summary>
public int Start { get; set; } /// <summary>
/// 每页显示的数据条数
/// </summary>
public int Length { get; set; } /// <summary>
/// 数据列
/// </summary>
public List<DataTablesColumns> Columns { get; set; } /// <summary>
/// 排序
/// </summary>
public List<DataTablesOrder> Order { get; set; } /// <summary>
/// 搜索
/// </summary>
public DataTablesSearch Search { get; set; } /// <summary>
/// 排序字段
/// </summary>
public string OrderBy => Columns != null && Columns.Any() && Order != null && Order.Any()
? Columns[Order[].Column].Data
: string.Empty; /// <summary>
/// 排序模式
/// </summary>
public DataTablesOrderDir OrderDir => Order != null && Order.Any()
? Order[].Dir
: DataTablesOrderDir.Desc;
} /// <summary>
/// 排序
/// </summary>
public class DataTablesOrder
{
/// <summary>
/// 排序的列的索引
/// </summary>
public int Column { get; set; } /// <summary>
/// 排序模式
/// </summary>
public DataTablesOrderDir Dir { get; set; }
} /// <summary>
/// 排序模式
/// </summary>
public enum DataTablesOrderDir
{
/// <summary>
/// 正序
/// </summary>
Asc, /// <summary>
/// 倒序
/// </summary>
Desc
} /// <summary>
/// 数据列
/// </summary>
public class DataTablesColumns
{
/// <summary>
/// 数据源
/// </summary>
public string Data { get; set; } /// <summary>
/// 名称
/// </summary>
public string Name { get; set; } /// <summary>
/// 是否可以被搜索
/// </summary>
public bool Searchable { get; set; } /// <summary>
/// 是否可以排序
/// </summary>
public bool Orderable { get; set; } /// <summary>
/// 搜索
/// </summary>
public DataTablesSearch Search { get; set; }
} /// <summary>
/// 搜索
/// </summary>
public class DataTablesSearch
{
/// <summary>
/// 全局的搜索条件的值
/// </summary>
public string Value { get; set; } /// <summary>
/// 是否为正则表达式处理
/// </summary>
public bool Regex { get; set; }
} }
这里传入的orderby是一个字符串,我们的方法需要一个lamada,那么就需要一个笨方法,将string转换成lamada
其实这个方法应该放到bll层里
private static Expression<Func<User, object>> GetLamada(string name)
{
Expression<Func<User, object>> func;
switch (name)
{
case "Id":
func = m => m.Id;
break;
case "Account":
func = m => m.Account;
break;
case "NickName":
func = m => m.NickName;
break;
case "IsEnabled":
func = m => m.IsEnabled;
break;
case "AddTime":
func = m => m.AddTime;
break;
case "LastTime":
func = m => m.LastTime;
break;
default:
func = m => m.OrderId;
break;
} return func;
}
var viewResult = result.ToModelList();
这里用到了autoMapper,我感觉我用的不太对,就先不讲了
参数被封装,返回值也有固定的格式,当然也被封装
using System.Collections.Generic; namespace FuturesContest.ViewModel.DataTables
{
public class DataTablesResult<T>
{
public DataTablesResult(int drawParam, int recordsTotalParam, int recordsFilteredParam,
IReadOnlyList<T> dataParam)
{
draw = drawParam;
recordsTotal = recordsTotalParam;
recordsFiltered = recordsFilteredParam;
data = dataParam;
} public DataTablesResult(string errorParam)
{
error = errorParam;
}
public int draw { get; set; }
public int recordsTotal { get; set; }
public int recordsFiltered { get; set; }
public IReadOnlyList<T> data { get; set; }
public string error { get; set; }
}
}
var resultJson = new DataTablesResult<UserViewModel>(query.Draw, totalCount, totalCount, viewResult);
接受返回的封装泛型,转换成json到前端
到这里,datatables的显示\排序\分页就都完成了
期货大赛项目|五,表格插件datatatables在MVC中的应用的更多相关文章
- 期货大赛项目|九,fileinput插件的应用
引入JS和CSS bundles.Add(new ScriptBundle("~/bundles/fileinputJs").Include( "~/Content/ve ...
- 期货大赛项目|四,MVC的数据验证
上图先看下效果 样式先不说,先了解下数据验证是怎么实现的 一 必须是强类型的视图 二 这些显示提示的话语,都在强类型的实体中 三 必须使用Html.BeginForm或者Html.AjaxBeginF ...
- 期货大赛项目|六,iCheck漂亮的复选框
废话不多说,直接上图 对,还是上篇文章的图,这次我们不研究datatables,而是看这个复选框,比平常的复选框漂亮太多 看看我是如何实现的吧 插件叫iCheck 用法也简单 引入js和css $(& ...
- 期货大赛项目|八,ueditor的应用
百度开发的富文本编辑器还是很不错的,可以已经不维护了 下载ueditor1_4_3_3-utf8-net放到项目中 找到net文件夹下config.json 修改以下两行 "imageUrl ...
- 期货大赛项目|十,MVC对js和css的压缩
在Global.asax中添加两行代码 //默认在调试期间,不会启用js和css的压缩 //下面的语句确保了在调试期间也压缩css和js BundleTable.EnableOptimizations ...
- 期货大赛项目|三,autofac简单用法
autofac是依赖注入 我们以前要引入一个dal层,是这么写的 private IDal _dao = new Dal() 我们可以看得出,这样写,我们的bll层不光依赖了接口IDal,还依赖了Da ...
- 期货大赛项目|二,DAL详解
接口层就不重点讲述了,直接DAL层 DAL层 using System; using System.Collections.Generic; using System.Linq; using Syst ...
- JQuery文件上传插件uploadify在MVC中Session丢失的解决方案
<script type="text/javascript"> var auth = "@(Request.Cookies[FormsAuthenticati ...
- [译]MVC网站教程(四):MVC4网站中集成jqGrid表格插件(系列完结)
目录 1. 介绍 2. 软件环境 3. 在运行示例代码之前(源代码 + 示例登陆帐号) 4. jqGrid和AJAX 5. GridSettings 6. ...
随机推荐
- ObjectARX® for Beginners: An Introduction
转:ObjectARX® for Beginners: An Introduction Lee Ambrosius – Autodesk, Inc. CP4164-L Objec ...
- Linux下C语言生成可执行文件的过程
在当前目录下创建一个C源文件并打开: touch test.c gedit test.c直接编译: gcc test.c -o test 分步骤编译: 1) 预处理 gcc -E test.c ...
- [BZOJ 4819] [SDOI 2017] 新生舞会
Description 学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴. 有 \(n\) 个男生和 \(n\) 个女生参加舞会买一个男生和一个女生一起跳舞,互为舞伴. C ...
- Codeforces 1077F2 Pictures with Kittens (hard version)(DP+单调队列优化)
题目链接:Pictures with Kittens (hard version) 题意:给定n长度的数字序列ai,求从中选出x个满足任意k长度区间都至少有一个被选到的最大和. 题解:数据量5000, ...
- Python import hook
转自http://blog.konghy.cn/2016/10/25/python-import-hook/,这里有好多好文章 import hook 通常被译为 探针.我们可以认为每当导入模块的时候 ...
- 主席树[可持久化线段树](hdu 2665 Kth number、SP 10628 Count on a tree、ZOJ 2112 Dynamic Rankings、codeforces 813E Army Creation、codeforces960F:Pathwalks )
在今天三黑(恶意评分刷上去的那种)两紫的智推中,突然出现了P3834 [模板]可持久化线段树 1(主席树)就突然有了不详的预感2333 果然...然后我gg了!被大佬虐了! hdu 2665 Kth ...
- SignarL服务器端发送消息给客户端的几种情况
一.所有连接的客户端 Clients.All.addContosoChatMessageToPage(name, message); 二.只发送给呼叫的客户端(即触发者) Clients.Caller ...
- Js中常用知识点(typeof、instanceof、动态属性、变量作用域)
1.Js中各类型的常量表示形式:Number:number String:string Object:objec 2.typeof运算符在Js中的使用:用于判断某一对象是何种类型,返回值 ...
- 自动化运维工具Ansible介绍
一个由 Python 编写的强大的配置管理解决方案.尽管市面上已经有很多可供选择的配置管理解决方案,但他们各有优劣,而 ansible 的特点就在于它的简洁. 让 ansible 在主流的配置管理系统 ...
- 我眼里K-Means算法
在我眼里一切都是那么简单,复杂的我也看不懂,最讨厌那些复杂的人际关系,唉,像孩子一样交流不好吗. 学习K-Means算法时,会让我想起三国志这个游戏,界面是一张中国地图,诸侯分立,各自为据.但是游戏开 ...