Net MVC使用datatables插件
基本用法
1 - 引入js和css
<link href="https://cdn.bootcss.com/datatables/1.10.19/css/dataTables.bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.bootcss.com/datatables/1.10.19/js/jquery.dataTables.min.js"></script> -- 这是核心库
<script src="https://cdn.bootcss.com/datatables/1.10.19/js/dataTables.bootstrap.min.js"></script> --这个是bootstrap拓展库,我一开始只引入了这个,没用的
2 - html
<table id="fieldTable" class="table table-bordered table-striped table-hover">
<thead>
<tr class="caption">
<th>序号</th>
<th data-data="NameEn">字段名</th>
<th data-data="NameCh">中文名</th>
<th data-data="FieldType">类型</th>
<th data-data="FieldLength">长度</th>
<th data-data="FieldNote">注释</th>
<th data-data="FieldExplain">说明</th>
</tr>
</thead>
</table>
3 - js
table = $('#fieldTable').DataTable({
"paging": false,
"ordering": false,
"info": false,
"searching": false,
"ajax": {
'url': '/Home/GetTableData',
'dataType': 'json',
'data': { TableId: tableId }
},
"columns": [
{ "data": null },
{ "data": "NameEn" },
{ "data": "NameCh" },
{ "data": "FieldType" },
{ "data": "FieldLength" },
{ "data": "FieldNote" },
{
"data": null,
"defaultContent": ''
},
{ "data": "FieldExplain" }
],
"columnDefs": [
{
"targets": -1,
"visible": false
},
{
"targets": -2,
"createdCell": function (td, cellData, rowData, row, col) {
if (cellData.FieldExplain.length > 0) {
$(td).addClass("details-control");
} }
} ],
"order": [[1, 'asc']],
"language": {
"processing": "加载中...",
"lengthMenu": "每页显示 _MENU_ 条数据",
"zeroRecords": "没有匹配结果",
"info": "显示第 _START_ 至 _END_ 项结果,共 _TOTAL_ 项",
"infoEmpty": "显示第 0 至 0 项结果,共 0 项",
"infoFiltered": "(由 _MAX_ 项结果过滤)",
"infoPostFix": "",
"search": "搜索:",
"url": "",
"emptyTable": "没有匹配结果",
"loadingRecords": "载入中..."
}
注意:这里有一个大坑,就是大小写问题,官网中文文档很多地方都是小写的,英文文档却是大写的,没有仔细研究大小写的差异,可自行百度 $('#fieldTable').DataTable
4 - cs
4.1 - 入参拓展类
using System.Collections.Generic;
using System.Linq; namespace TrumguDataExplain.Web.Models.DataTables
{
/// <summary>
/// DataTables参数
/// </summary>
public class DataTablesParameters
{
public string TableId { get; set; }
/// <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; }
}
}
一般是 搜索条件 继承这个类 我这里有个TableId原本不该属于这个类,只是懒得继承了
4.2 - 出参拓展类
using System.Collections.Generic; namespace TrumguDataExplain.Web.Models.DataTables
{
/// <summary>
/// DataTable的返回信息
/// </summary>
/// <typeparam name="TEntity"></typeparam>
public class DataTablesResult<TEntity>
{
/// <summary>
/// 构造函数
/// </summary>
/// <param name="draw0">请求次数计数器</param>
/// <param name="recordsTotal0">总共记录数</param>
/// <param name="recordsFiltered0">过滤后的记录数</param>
/// <param name="data0">数据</param>
public DataTablesResult(int draw0, int recordsTotal0, int recordsFiltered0, IReadOnlyList<TEntity> data0)
{
draw = draw0;
recordsTotal = recordsTotal0;
recordsFiltered = recordsFiltered0;
data = data0;
} /// <summary>
/// 构造函数
/// </summary>
/// <param name="error0">服务器错误信息</param>
public DataTablesResult(string error0)
{
error = error0;
} /// <summary>
/// 请求次数计数器
/// </summary>
public int draw { get; set; } /// <summary>
/// 总共记录数
/// </summary>
public int recordsTotal { get; set; } /// <summary>
/// 过滤后的记录数
/// </summary>
public int recordsFiltered { get; set; } /// <summary>
/// 数据
/// </summary>
public IReadOnlyList<TEntity> data { get; set; } /// <summary>
/// 错误信息
/// </summary>
public string error { get; set; }
}
}
感觉这个类 一般情况下倒是不需要修改
4.3 - 前端请求方法
/// <summary>
/// dataTable
/// </summary>
/// <param name="parameters"></param>
/// <returns></returns>
public JsonResult GetTableData(DataTablesParameters parameters)
{
IBaseBll<FieldInfo> fieldBll = new BaseBll<FieldInfo>();
var list = fieldBll.QueryByIf(m => m.TableId == Convert.ToInt32(parameters.TableId)).ToList();
var count = list.Count();
return DataTablesJson(parameters.Draw, count, count, list);
}
4.4 - 返回json组合方法
/// <summary>
/// 构造函数
/// </summary>
/// <param name="draw">请求次数计数器</param>
/// <param name="recordsTotal">总共记录数</param>
/// <param name="recordsFiltered">过滤后的记录数</param>
/// <param name="data">数据</param>
/// <param name="error">服务器错误信息</param>
public JsonResult DataTablesJson<TEntity>(int draw, int recordsTotal, int recordsFiltered,
IReadOnlyList<TEntity> data, string error = null)
{
var result = new DataTablesResult<TEntity>(draw, recordsFiltered, recordsFiltered, data); return Json(result, JsonRequestBehavior.AllowGet);
}
到这里基本表格就可以显示数据了!
在说一下我这里用到的一些方法
1 - 自定义索引列
"columns": [
{ "data": null },
{ "data": "NameEn" },
{ "data": "NameCh" },
{ "data": "FieldType" },
{ "data": "FieldLength" },
{ "data": "FieldNote" },
{
"data": null,
"defaultContent": ''
},
{ "data": "FieldExplain" }
],
js初始化时,第一列要为空 然后调用下面的函数
//重绘dataTable 自定义序号
function Init_Index() {
table.on('draw.dt',
function () {
table.column(0,
{
search: 'applied',
order: 'applied'
}).nodes().each(function (cell, i) {
//i 从0开始,所以这里先加1 i = i + 1;
//服务器模式下获取分页信息,使用 DT 提供的 API 直接获取分页信息 var page = table.page.info();
//当前第几页,从0开始 var pageno = page.page;
//每页数据 var length = page.length;
//行号等于 页数*每页数据长度+行号 var columnIndex = (i + pageno * length);
cell.innerHTML = columnIndex;
});
});
}
2 - 表格附加信息的添加
"columns": [
{ "data": null },
{ "data": "NameEn" },
{ "data": "NameCh" },
{ "data": "FieldType" },
{ "data": "FieldLength" },
{ "data": "FieldNote" },
{
"data": null,
"defaultContent": ''
},
{ "data": "FieldExplain" }
],
看倒数第二列时我打算,在这里显示加号的,所以这列的data也为null
"columnDefs": [
{
"targets": -1,
"visible": false
},
{
"targets": -2,
"createdCell": function (td, cellData, rowData, row, col) {
if (cellData.FieldExplain.length > 0) {
$(td).addClass("details-control");
} }
}
],
我对倒数第二列 createdCell 创建单元格的函数,进行了逻辑判断,如果怎么样,对这个单元格加class
td.details-control {
background: url('../resources/images/details_open.png') no-repeat center center;
cursor: pointer;
}
tr.shown td.details-control {
background: url('../resources/images/details_close.png') no-repeat center center;
}
官网的css被我超了下来
//注入details-control click事件
function init_click() {
$('#fieldTable tbody').on('click', 'td.details-control', function () {
var tr = $(this).closest('tr');
var row = table.row(tr);
if (row.child.isShown()) {
row.child.hide();
tr.removeClass('shown');
}
else {
row.child(format(row.data())).show();
tr.addClass('shown');
}
});
};
对这个class的元素进行click事件的注入,要放到ready里
//附加信息样式
function format(d) {
return '<table border="0" style="padding-left:50px;">' +
'<tr>' +
'<td>说明:</td>' +
'<td>' + d.FieldExplain + '</td>' +
'</tr>' +
'</table>';
}
上面的一个方法,调用了该函数,这个函数时信息样式
3 - 中文设置
"language": {
"processing": "加载中...",
"lengthMenu": "每页显示 _MENU_ 条数据",
"zeroRecords": "没有匹配结果",
"info": "显示第 _START_ 至 _END_ 项结果,共 _TOTAL_ 项",
"infoEmpty": "显示第 0 至 0 项结果,共 0 项",
"infoFiltered": "(由 _MAX_ 项结果过滤)",
"infoPostFix": "",
"search": "搜索:",
"url": "",
"emptyTable": "没有匹配结果",
"loadingRecords": "载入中..."
}
网上有很多
4 - 重新传参,也就是点击搜索之后,重新刷新表格数据
var param = { TableId: data.node.id }
table.settings()[0].ajax.data = param;
table.ajax.reload();
这个相当有意思,很难在官网找到重新传递参数的方法,都是reload和url.load,但我并不想换后台的url啊?官网的想法让我很崩溃
如果在重新创建datatable,因为已经创建过了,还是回报错
终于 在网上找到了相关的资料
用settings[0].ajax.data重新定义参数
然后再ajax.reload
最后 上个图吧
Net MVC使用datatables插件的更多相关文章
- [jQuery]jQuery DataTables插件自定义Ajax分页实现
前言 昨天在博客园的博问上帮一位园友解决了一个问题,我觉得有必要记录一下,万一有人也遇上了呢. 问题描述 园友是做前端的,产品经理要求他使用jQuery DataTables插件显示一个列表,要实现分 ...
- jquery.dataTables插件使用例子详解
DataTables是一个jQuery的表格插件.这是一个高度灵活的工具,依据的基础逐步增强,这将增加先进的互动控制,支持任何HTML表格 效果图 代码 <!doctype html> & ...
- Mvc.JQuery.Datatables
1.NuGet安装Mvc.JQuery.Datatables.Mvc.JQuery.Datatables.Templates和JQuery.Datatables https://github.com/ ...
- MVC框架的插件与拦截器基础
自制MVC框架的插件与拦截器基础 上篇谈到我自己写的MVC框架,接下来讲讲插件及拦截器! 在处理一些通用的逻辑最好把它封装一个插件或者拦截器,以便日后可以直接拿过来直接使用.在我的框架中可以通过继承以 ...
- dataTables 插件学习整理
在项目中使用了dataTables 插件,学习整理一下. dataTables 的官方中文网站 http://www.datatables.club 引入文件: 所有的都要引入 jq文件 1. dat ...
- Datatables插件1.10.15版本服务器处理模式ajax获取分页数据实例解析
一.问题描述 前端需要使用表格来展示数据,找了一些插件,最后确定使用dataTables组件来做. 后端的分页接口已经写好了,不能修改.接口需要传入页码(pageNumber)和页面显示数据条数(pa ...
- 前端Datatables自定义事件(监听Datatables插件一些常见的事件动作)
今天开发项目的时候,用Datatables插件做前端分页列表,想在列表发生翻页.排序.搜索.改变单页显示数据条数这些行为的时候做一些其他的操作,看了半天Datatables官网终于找到可以监测到这些事 ...
- jQuery DataTables插件分页允许输入页码跳转
背景说明 项目中使用jQuery DataTables插件来实现分页表格,但是默认的分页样式不能输入页码进行跳转,在页数非常多的时候使用很不方便,最主要的还是没有达到产品部门的设计要求,所以我需要寻找 ...
- Django使用DataTables插件总结
Django使用Datatables插件总结 文章中的例子已上传至github 基本使用 Datatables插件是一款方便简单的展示数据的列表插件.关于基本使用,官方网站上的已介绍的很详细,这里我再 ...
随机推荐
- tar.gz,直接解压可用?还是需要编译安装?
在linux搭建环境,下载的tar.gz安装包,有的直接解压就可以用,有的需要编译安装后才可用 怎么知道该怎么操作呢? 其实,tar -zxvf解压后,进入目录看README.md就知道答案了 另外, ...
- jira,Confluence 的JVM内存优化
个人喜好,可能不是很适合大众 JIRA 修改setenv.sh,调整JVM为4096m [root@jira_confluence ~]# cd /app/atlassian/jira/bin/ [r ...
- Django中ORM介绍
Object Relational Mapping(ORM) ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据 ...
- HTTP与HTTPS(转)
一.什么是HTTP? 什么是HTTPS? HTTP:(Hyper Text Transfer Protocol 超文本传输协议) HTTPS:(Hyper Text Transfer Protoco ...
- MySQL 水平拆分与垂直拆分详解
前言:说到优化mysql,总会有这么个回答:水平拆分,垂直拆分,那么我们就来说说什么是水平拆分,垂直拆分. 一.垂直拆分 说明:一个数据库由很多表的构成,每个表对应着不同的业务,垂直切分是指按照业务将 ...
- Kubernetes之canal的网络策略(NetworkPolicy)
安装要求: 1.我们这里安装的是3.3的版本.kubernetes的要求: 支持的版本 1.10 1.11 1.12 2.CNI插件需要启用,Calico安装为CNI插件.必须通过传递--networ ...
- 静态网站创建工具Docusaurus
地址:https://docusaurus.io/docs/zh-CN/installation 安装 Docusaurus
- 《11招玩转网络安全》之第三招:Web暴力破解-Low级别
Docker中启动LocalDVWA容器,准备DVWA环境.在浏览器地址栏输入http://127.0.0.1,中打开DVWA靶机.自动跳转到了http://127.0.0.1/login.php登录 ...
- 虚拟机有QQ消息时宿主机自动弹窗提示
因为是检测窗口实现的,所以要求设置会话窗口自动弹出,而且看完消息就把QQ消息窗口关掉... 虚拟机端 #! /usr/bin/env python # -*- coding: utf-8 -*- fr ...
- python zip dict函数
1.zip函数 zip函数可以接受多个参数,返回的结果是列表,列表中的每一个元素是元组的数据类型,下面我们通过几个例子来学习zip函数的用法 1) list1 = [1,2,3] list2 = [4 ...