基本用法

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插件的更多相关文章

  1. [jQuery]jQuery DataTables插件自定义Ajax分页实现

    前言 昨天在博客园的博问上帮一位园友解决了一个问题,我觉得有必要记录一下,万一有人也遇上了呢. 问题描述 园友是做前端的,产品经理要求他使用jQuery DataTables插件显示一个列表,要实现分 ...

  2. jquery.dataTables插件使用例子详解

    DataTables是一个jQuery的表格插件.这是一个高度灵活的工具,依据的基础逐步增强,这将增加先进的互动控制,支持任何HTML表格 效果图 代码 <!doctype html> & ...

  3. Mvc.JQuery.Datatables

    1.NuGet安装Mvc.JQuery.Datatables.Mvc.JQuery.Datatables.Templates和JQuery.Datatables https://github.com/ ...

  4. MVC框架的插件与拦截器基础

    自制MVC框架的插件与拦截器基础 上篇谈到我自己写的MVC框架,接下来讲讲插件及拦截器! 在处理一些通用的逻辑最好把它封装一个插件或者拦截器,以便日后可以直接拿过来直接使用.在我的框架中可以通过继承以 ...

  5. dataTables 插件学习整理

    在项目中使用了dataTables 插件,学习整理一下. dataTables 的官方中文网站 http://www.datatables.club 引入文件: 所有的都要引入 jq文件 1. dat ...

  6. Datatables插件1.10.15版本服务器处理模式ajax获取分页数据实例解析

    一.问题描述 前端需要使用表格来展示数据,找了一些插件,最后确定使用dataTables组件来做. 后端的分页接口已经写好了,不能修改.接口需要传入页码(pageNumber)和页面显示数据条数(pa ...

  7. 前端Datatables自定义事件(监听Datatables插件一些常见的事件动作)

    今天开发项目的时候,用Datatables插件做前端分页列表,想在列表发生翻页.排序.搜索.改变单页显示数据条数这些行为的时候做一些其他的操作,看了半天Datatables官网终于找到可以监测到这些事 ...

  8. jQuery DataTables插件分页允许输入页码跳转

    背景说明 项目中使用jQuery DataTables插件来实现分页表格,但是默认的分页样式不能输入页码进行跳转,在页数非常多的时候使用很不方便,最主要的还是没有达到产品部门的设计要求,所以我需要寻找 ...

  9. Django使用DataTables插件总结

    Django使用Datatables插件总结 文章中的例子已上传至github 基本使用 Datatables插件是一款方便简单的展示数据的列表插件.关于基本使用,官方网站上的已介绍的很详细,这里我再 ...

随机推荐

  1. linux的/etc/profile、~/.profile、~/.bashrc、~./bash_profile这几个配置文件

    在添加环境变量的时候,我们会去修改配置文件 如果留意过,网上博文,有些在/etc/profile文件中配置的,有些是在~./bash_profile文件中配置的,等等 那么,/etc/profile. ...

  2. JavaScript DOM 高级程序设计读书笔记一

    创建可重用的对象 简而言之,对象就是包含一组变量(称为属性)和函数(称为方法)的集合的实例.对象通常由类派生而来,而类中定义了对象拥有的属性和方法.如果你的脚本中都是对象之间的交互操作,那么就可以称之 ...

  3. 使用BeautifulSoup

    下载bs4,导入BeautifulSoup pip install bs4 from bs4 import BeautifulSoup BeautifulSoup 的使用 创建对象 r = reque ...

  4. windows环境下安装composer,然后使用composer安装Laravel

    Composer 不是一个包管理器,它仅仅是一个依赖管理工具,它允许你申明项目所依赖的代码库,并在你的项目中安装这些代码库.它涉及 “packages” 和 “libraries”,但它在每个项目的基 ...

  5. 阅读阿里文档总结————Mysql数据库篇

    一:建表规范 1.针对于任何字段如果为非负数,必须是 unsigned: 2.表达逻辑删除的字段名 is_deleted,1 表示删除,0 表示未删除: (1为是:0为否) 3.主键索引名为 pk_字 ...

  6. 五十六、linux 编程——UDP 编程模型

    56.1 UDP 编程模型 56.1.1 编程模型 UDP 协议称为用户数据报文协议,可靠性比 TCP 低,但执行效率高 56.1.2 API (1)发送数据 函数参数: sockfs:套接字文件描述 ...

  7. CentOS Linux change IP Address

    1.change network card configure edit: vi /etc/sysconfig/network-scripts/ifcfg-eth0 ps:notice HWADDR! ...

  8. react native头部标题样式修改

    navigationOptions: ({navigation}) => ({ headerTitle:'评估记录', headerBackTitle:null, headerLeft:null ...

  9. ASP.NET Web API 2 OData v4教程

    程序数据库格式标准化的开源数据协议 为了增强各种网页应用程序之间的数据兼容性,微软公司启动了一项旨在推广网页程序数据库格式标准化的开源数据协议(OData)计划,于此同时,他们还发 布了一款适用于OD ...

  10. Hibernate 分页

    public EmailBean[] findByPage(Date begin, Date end, String emailreference, int pageNo, final int pag ...