jQuery插件DataTable使用方法详解(.Net平台)


Posted in Javascript onDecember 22, 2016

上一篇随笔提到了MvcPager,最近用到了一款前端JQ插件------DataTable(简称DT),很好用。

DT是一款前端插件,和后端完全分离开,就这点来看,我就特别喜欢。

一.使用DT,需要以下支持

jQuery插件DataTable使用方法详解(.Net平台)

js:jq+jquery.dataTables.min.js

 二、页面上进行引入js,直接使用DT功能

前端代码:

<!DOCTYPE html>

<html>
<head>
 <meta charset="utf-8">
 <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
 <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no" />
 <title>用户列表</title>
 <link href="~/Content/Scripts/h-ui/css/H-ui.min.css" rel="stylesheet" />
 <link href="~/Content/Scripts/h-ui.admin/css/H-ui.admin.css" rel="stylesheet" />
 <link href="~/Content/Scripts/Hui-iconfont/1.0.8/iconfont.css" rel="stylesheet" />

 <style>
  .page-container {
   padding: 10px;
  }

  .operation {
   background: #EFEEF0;
   padding: 3px;
  }

  .search {
   background: #EFEEF0;
   padding: 5px;
   margin-top: 5px;
  }

  .table {
   margin-top: 10px;
  }

  .dataTables_info {
   margin-left: 5px;
  }

  #table1_info {
   padding: 0;
  }

  #table1_length {
   margin-left: 15px;
  }
 </style>
 <!--引入脚本解决兼容性(hack技术,必须放入head中)-->
 <!--[if lt IE 9]>
 <script src="~/Content/Scripts/html5_css3/html5shiv.min.js"></script>
 <script src="~/Content/Scripts/html5_css3/respond.min.js"></script>
 <script src="~/Content/Scripts/PIE-2.0beta1/PIE_IE678.js"></script>
 <![endif]-->
</head>
<body>
 <div class="page-container">
  <div class="operation">
   <a class="btn btn-danger radius" href="javascript:;"><i class="Hui-iconfont"></i> 批量删除</a>
   <a class="btn btn-primary radius" href="javascript:;"><i class="Hui-iconfont"></i> 添加用户</a>
  </div>

  <div class="search">
   <input type="text" id="nickname" class="input-text" style="width:100px;" placeholder="昵称">
   <button id="search" class="btn btn-success" type="submit"><i class="Hui-iconfont"></i> 查询</button>
  </div>

  <div class="table">
   <table id="table1" class="table table-border table-bordered table-bg table-hover">
    <thead>
     <tr class="text-c">
      <th><input type="checkbox" name="" value=""></th>
      <th>昵称</th>
      <th>账号</th>
      <th>密码</th>
      <th>添加时间</th>
      <th>修改时间</th>
      <th>是否禁用</th>
      <th>操作</th>
     </tr>
    </thead>
   </table>
  </div>
 </div>
</body>
</html>
<script src="~/Content/Scripts/jquery-2.0.3.min.js"></script>
<script src="~/Content/Scripts/datatables/1.10.13/jquery.dataTables.min.js"></script>
<script src="~/Content/Scripts/h-ui/js/H-ui.js"></script>
<script src="~/Content/Scripts/h-ui.admin/js/H-ui.admin.js"></script>

<script type="text/javascript">
 var table1 = null;
 $(function() {
  table1=initializeTable();
  $("#search").click(function() {
   table1.ajax.reload();
  });
 });
 
 function initializeTable() {//初始化table
  var table = $("#table1").DataTable({
   /****************************************表格数据加载****************************************************/
   "serverSide": true,
   "ajax": {//ajax请求数据源
    "url": "/UserInfo/Manager/Search",
    "type": "post",
    "data": function (data) {//添加额外的数据给服务器
     data.pageIndex = (data.start / data.length) + 1;
     data.nickname = $("#nickname").val().trim();
    }
   },
   "columns": [//列绑定
    { "defaultContent": "" },
    { "data": "Nickname" },
    { "data": "LoginName" },
    { "data": "LoginPassword" },
    { "data": "AddTime" },
    { "data": "ModifyTime" },
    { "data": "IsForbidden" },
    { "defaultContent": "" }
   ],
   "columnDefs": [//列定义
    {
     "targets": [0],
     "data": "UserInfoId",
     "render": function (data, type, full) {//全部列值可以通过full.列名获取,一般单个列值用data PS:这里的render是有多少列就执行多少次方法。。。不知道为啥
      return "<input type='checkbox' value='" + data + "' name='UserInfoId'>";
     }
    },
    {
     "targets": [4],
     "data": "AddTime",
     "render": function (data, type, full) {//全部列值可以通过full.列名获取,一般单个列值用data PS:这里的render是有多少列就执行多少次方法。。。不知道为啥
      if (data == null || data.trim() == "") { return ""; }
      else { var date = new Date(parseInt(data.slice(6))); return date.getFullYear() + "/" + date.getMonth() + "/" + date.getDate(); }
     }
    },
    {
     "targets": [5],
     "data": "ModifyTime",
     "render": function (data, type, full) {//全部列值可以通过full.列名获取,一般单个列值用data PS:这里的render是有多少列就执行多少次方法。。。不知道为啥
      if (data == null || data.trim() == "") { return "/"; }
      else { var date = new Date(parseInt(data.slice(6))); return date.getFullYear() + "/" + date.getMonth() + "/" + date.getDate(); }
     }
    },
    {
     "targets": [6],
     "data": "IsForbidden",
     "render": function (data, type, full) {//全部列值可以通过full.列名获取,一般单个列值用data PS:这里的render是有多少列就执行多少次方法。。。不知道为啥
      if (data) { return "是"; }
      else { return "否"; }
     }
    },
    {
     "targets": [7],
     "data": "UserInfoId",
     "render": function (data, type, full) {//全部列值可以通过full.列名获取,一般单个列值用data PS:这里的render是有多少列就执行多少次方法。。。不知道为啥
      return "<a style='text-decoration:none' class='ml-5 f-14' onclick=article_edit('资讯编辑','article-add.html','" + data + "') href='javascript:;' title='编辑'><i class='Hui-iconfont'></i></a>" +
       "<a style='text-decoration:none' class='ml-5 f-14' onclick=article_del(this,'" + data + "') href='javascript:;' title='删除'><i class='Hui-iconfont'></i></a>";
     }
    },

    { "orderable": false, "targets": [0, 7] },// 是否排序
    //{ "visible": false, "targets": [3, 5] }//是否可见
   ],
   "rowCallback": function (row, data, displayIndex) {//行定义
    $(row).attr("class", "text-c");
   },
   "initComplete": function (settings, json) { //表格初始化完成后调用

   },
   /****************************************表格数据加载****************************************************/
   /****************************************表格样式控制****************************************************/
   "dom": "t<'dataTables_info'il>p",//表格布局
   "language": {//语言国际化
    "lengthMenu": "每页 _MENU_ 条",
    "zeroRecords": "没有找到记录",
    "info": "当前显示 _START_ 到 _END_ 条,共 _TOTAL_条",
    "infoEmpty": "无记录",
    "paginate":
    {
     "first": "首页",
     "previous": "前一页",
     "next": "后一页",
     "last": "末页"
    }
   },
   "pagingType": "full_numbers",//分页格式
   "processing": true,//等待加载效果
   "ordering": false,//排序功能
   /****************************************表格样式控制****************************************************/
  });
  return table;
 }
</script>

 后端代码:

/****************Controller后台代码******************/
public ActionResult Search(DataTable dt,string nickname)
  {
   int total;
   int pageSize = dt.length;
   int pageIndex = dt.pageIndex;

   IQueryable<Model.UserInfo> userInfoIq=CurrentBllSession.UserInfoBll.GetIQueryableBySearchPage(pageIndex,pageSize,out total,nickname);
   List<Model.UserInfo> userInfoList = userInfoIq.ToList();
   dt.recordsTotal = total;
   dt.recordsFiltered = total ;
   dt.data = userInfoList;

   return Json(dt);
  }


/**************************Bll服务代码************************/
 public IQueryable<UserInfo> GetIQueryableBySearchPage(int pageIndex,int pageSize,out int total,string nickname)
  {
   IQueryable<UserInfo> userInfoIq= CurrentDal.GetIQueryable();

   if (!string.IsNullOrEmpty(nickname))
   {
    userInfoIq=userInfoIq.Where(a => a.Nickname.Contains(nickname));
   }
   total=userInfoIq.Count();
   userInfoIq=userInfoIq.OrderByDescending(a => a.AddTime);
   userInfoIq=userInfoIq.Skip((pageIndex - 1)*pageSize).Take(pageSize);//分页前必须排序,不然EF报错

   return userInfoIq;
  }
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ViewModel
{
 /// <summary>
 /// JqueryDataTable插件交互的DT格式的数据(DT参数区分大小写)
 /// </summary>
 public class DataTable
 {
  /// <summary>
  /// 请求次数(前端==》后端)
  /// </summary>
  public int draw { get; set; }

  /// <summary>
  /// 总记录数(前端《==后端)
  /// </summary>
  public int recordsTotal { get; set; }

  /// <summary>
  /// 过滤后的总记录数(前端《==后端)
  /// </summary>
  public int recordsFiltered { get; set; }

  /// <summary>
  /// 记录开始索引(前端==》后端)
  /// </summary>
  public int start { get; set; }

  /// <summary>
  /// PageIndex(前端==》后端)
  /// </summary>
  public int pageIndex { get; set; }

  /// <summary>
  /// PageSize(前端==》后端)
  /// </summary>
  public int length { get; set; }

  /// <summary>
  /// 集合分页数据(前端《==后端)
  /// </summary>
  public IList data { get; set; } 
 }
}

这样就搞定了。。。是不是很简单(● ̄(エ) ̄●)

?(?_?)?好的,我来解释下。 

前台:

首先我们的table只是给出了thead部分,那么tbody部分呢?交给DT来完成,由DT来控制。那么我们先来初始化DT,js会调用initializeTable()方法,方法里调用$("#table1").DataTable({各种配置});来配置DT。至于这些配置的作用,我代码里都做了注释,详细的配置解释,可以查看官网的文档。

配置里有一项很重要,就是ajax配置项,这里是数据源的配置项,数据源可以有多种,我这里选用了ajax异步请求数据源。

"url": "/UserInfo/Manager/Search"这个是配置了DT请求数据的url地址

 "type": "post"指明了以post方式发送请求

 "data":

function (data) {
//添加额外的数据给服务器
 data.pageIndex = (data.start / data.length) + 1;
 data.nickname = $("#nickname").val().trim();
}

这了由于我用到了搜索的功能,所以每次请求数据的时候,要把搜索的条件作为附加的数据传给服务器

最后,注意要加上"serverSide": true,因为我们的数据都是从后台过来的,不是前台的静态数据,要开启“服务器模式”,这样,你每次对表格的操作,都会变成一次次的请求发送给服务器。

 后台:

后台负责提供数据源,使用自定义的DataTable类来作为格式化的数据进行交互。当然这里的DataTable类不是必须的,你只要满足前后数据交互的格式就可以,这里封装成一个类,是为了方便。

DT建议我们交互的数据格式,最起码要包含以下几项,我用匿名类来表示(区分大小写):

new {

draw=***,

recordsTotal=***,

recordsFiltered=***,

data=***,

}

其他项的话,你可以根据自己的实际情况自行添加。

准备好了数据之后呢,把数据Json序列化后,返回给前端,即可。

效果图:

jQuery插件DataTable使用方法详解(.Net平台)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript attachEvent绑定多个事件执行顺序问题
Oct 20 Javascript
通过length属性判断jquery对象是否存在
Oct 18 Javascript
兼容FF和IE的动态table示例自写
Oct 21 Javascript
jQuery控制TR显示隐藏的三种常用方法
Aug 21 Javascript
基于JavaScript实现定时跳转到指定页面
Jan 01 Javascript
JavaScript 不支持 indexof 该如何解决
Mar 30 Javascript
javascript高级选择器querySelector和querySelectorAll全面解析
Apr 07 Javascript
详解jQuery简单的表单应用
Dec 16 Javascript
基于JavaScript实现带数据验证和复选框的表单提交
Aug 23 Javascript
JS实现的简单标签点击切换功能示例
Sep 21 Javascript
Node使用Sequlize连接Mysql报错:Access denied for user ‘xxx’@‘localhost’
Jan 03 Javascript
Vue使用NPM方式搭建项目
Oct 25 Javascript
JS实现间歇滚动的运动效果实例
Dec 22 #Javascript
javascript-解决mongoose数据查询的异步操作
Dec 22 #Javascript
Bootstrap popover用法详解
Dec 22 #Javascript
深入学习jQuery中的data()
Dec 22 #Javascript
读Javascript高性能编程重点笔记
Dec 21 #Javascript
解决拦截器对ajax请求的拦截实例详解
Dec 21 #Javascript
原生的强大DOM选择器querySelector介绍
Dec 21 #Javascript
You might like
浅析PKI加密解密 OpenSSL
2013/07/01 PHP
关于PHP中协程和阻塞的一些理解与思考
2017/08/11 PHP
js使用函数绑定技术改变事件处理程序的作用域
2011/12/26 Javascript
JS去掉第一个字符和最后一个字符的实现代码
2014/02/20 Javascript
js遍历子节点子元素附属性及方法
2014/08/19 Javascript
第九章之路径分页标签与徽章组件
2016/04/25 Javascript
jQuery实现Select左右复制移动内容
2016/08/05 Javascript
JavaScript编写九九乘法表(两种任选)
2017/02/04 Javascript
深入理解 JavaScript 中的 JSON
2017/04/06 Javascript
SVG动画vivus.js库使用小结(实例代码)
2017/09/14 Javascript
详解使用vue-cli脚手架初始化Vue项目下的项目结构
2018/03/08 Javascript
ng-repeat指令在迭代对象时的去重方法
2018/10/02 Javascript
关于AOP在JS中的实现与应用详解
2019/05/06 Javascript
VUE单页面切换动画代码(全网最好的切换效果)
2019/10/31 Javascript
Python实现端口复用实例代码
2014/07/03 Python
Python选择排序、冒泡排序、合并排序代码实例
2015/04/10 Python
改进Django中的表单的简单方法
2015/07/17 Python
python图片验证码生成代码
2016/07/02 Python
Python 备份程序代码实现
2017/03/06 Python
flask框架视图函数用法示例
2018/07/19 Python
在python中pandas读文件,有中文字符的方法
2018/12/12 Python
Python OpenCV 使用滑动条来调整函数参数的方法
2019/07/08 Python
使用python3批量下载rbsp数据的示例代码
2019/12/20 Python
opencv+python实现均值滤波
2020/02/19 Python
Canvas环形饼图与手势控制的实现代码
2019/11/08 HTML / CSS
英国和国际包裹递送:ParcelCompare
2019/08/26 全球购物
小米俄罗斯授权商店:Xiaomi俄罗斯
2019/12/08 全球购物
在子网210.27.48.21/30种有多少个可用地址?分别是什么?
2014/07/27 面试题
自我评价的写作规则
2014/01/06 职场文书
企业总经理职责
2014/02/02 职场文书
2014年五一活动策划方案
2014/03/15 职场文书
离婚协议书范文2014
2014/10/16 职场文书
2014年幼师工作总结
2014/11/22 职场文书
幼儿园中班教师个人总结
2015/02/05 职场文书
Vue Element UI自定义描述列表组件
2021/05/18 Vue.js
Win11 BitLocker 驱动器加密
2022/04/19 数码科技