系统中都需要表格,我见过最好的表格就是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中的应用的更多相关文章

  1. 期货大赛项目|九,fileinput插件的应用

    引入JS和CSS bundles.Add(new ScriptBundle("~/bundles/fileinputJs").Include( "~/Content/ve ...

  2. 期货大赛项目|四,MVC的数据验证

    上图先看下效果 样式先不说,先了解下数据验证是怎么实现的 一 必须是强类型的视图 二 这些显示提示的话语,都在强类型的实体中 三 必须使用Html.BeginForm或者Html.AjaxBeginF ...

  3. 期货大赛项目|六,iCheck漂亮的复选框

    废话不多说,直接上图 对,还是上篇文章的图,这次我们不研究datatables,而是看这个复选框,比平常的复选框漂亮太多 看看我是如何实现的吧 插件叫iCheck 用法也简单 引入js和css $(& ...

  4. 期货大赛项目|八,ueditor的应用

    百度开发的富文本编辑器还是很不错的,可以已经不维护了 下载ueditor1_4_3_3-utf8-net放到项目中 找到net文件夹下config.json 修改以下两行 "imageUrl ...

  5. 期货大赛项目|十,MVC对js和css的压缩

    在Global.asax中添加两行代码 //默认在调试期间,不会启用js和css的压缩 //下面的语句确保了在调试期间也压缩css和js BundleTable.EnableOptimizations ...

  6. 期货大赛项目|三,autofac简单用法

    autofac是依赖注入 我们以前要引入一个dal层,是这么写的 private IDal _dao = new Dal() 我们可以看得出,这样写,我们的bll层不光依赖了接口IDal,还依赖了Da ...

  7. 期货大赛项目|二,DAL详解

    接口层就不重点讲述了,直接DAL层 DAL层 using System; using System.Collections.Generic; using System.Linq; using Syst ...

  8. JQuery文件上传插件uploadify在MVC中Session丢失的解决方案

    <script type="text/javascript"> var auth = "@(Request.Cookies[FormsAuthenticati ...

  9. [译]MVC网站教程(四):MVC4网站中集成jqGrid表格插件(系列完结)

    目录 1.   介绍 2.   软件环境 3.   在运行示例代码之前(源代码 + 示例登陆帐号) 4.         jqGrid和AJAX 5.         GridSettings 6.  ...

随机推荐

  1. linux 安装所有软件可以使用这个网站搜索RPM包

    #很方便很实用  强烈推荐 https://pkgs.org/

  2. BZOJ3028食物——生成函数+泰勒展开

    题目描述 明明这次又要出去旅游了,和上次不同的是,他这次要去宇宙探险!我们暂且不讨论他有多么NC,他又幻想了他应 该带一些什么东西.理所当然的,你当然要帮他计算携带N件物品的方案数.他这次又准备带一些 ...

  3. Disconf 分布式配置管理平台(安装配置)

    Disconf 分布式配置管理平台(安装配置) 依赖环境 Nginx:处理静态资源请求.动态请求转发到Tomcat Tomcat:处理Nginx的请求 Redis:用户session管理 MySQL: ...

  4. H5与APP混合开发相关知识点总结

    整理一: 现在有这么个需求,如下图 app端点击右上角的 加 号 ,弹出模态框 这个项目是基于vue写的,客户端需要调用H5页面里定义的js方法,但是在vue里,所有的方法都是在组件内部声明的,也只能 ...

  5. Java【第九篇】异常处理

    异常概述 介绍 任何一种程序设计语言设计的程序在运行时都有可能出现错误,例如除数为0,数组下标越界,要读写的文件不存在等等.捕获错误最理想的是在编译期间,但有的错误只有在运行时才会发生.对于这些错误, ...

  6. kafka 发送确认参数acks的几种模式

    1. acks=0 意味着生产者能够通过网络吧消息发送出去,那么就认为消息已成功写入Kafka 一定会丢失一些数据 2. acks=1 意味着首领在疏导消息并把它写到分区数据问津是会返回确认或者错误响 ...

  7. POM文件分析记

    pom英文全称:project object model 1.简介 pom.xml文件描述了maven项目的基本信息,比如groupId,artifactId,version等.也可以对maven项目 ...

  8. golang net包使用

    创建简单的响应服务器 package main import ( "net/http" ) func handlerFunc(w http.ResponseWriter, r *h ...

  9. 第十节: EF的三种追踪实体状态变化方式(DBEntityEntry、ChangeTracker、Local)

    一. 简介 我们在前面章节介绍EF基本增删改的时候,曾说过EF的SaveChanges()方法,会一次性的将所有的实体的状态变化统一提交到数据库,那么你是否想过EF的实体会有哪些状态变化呢?什么原因会 ...

  10. 【转载】c++类的实例化与拷贝

    https://www.cnblogs.com/chris-cp/p/3578976.html c++的默认拷贝构造函数,从深度拷贝和浅拷贝说起: https://blog.csdn.net/qq_2 ...