jQuery插件DataTable使用方法詳解(.Net平臺)
上一篇隨筆提到了MvcPager,最近用到了一款前端JQ插件------DataTable(簡稱DT),很好用。
DT是一款前端插件,和后端完全分離開,就這點來看,我就特別喜歡。
一.使用DT,需要以下支持

js:jq+jquery.dataTables.min.js
二、頁面上進(jìn)行引入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技術(shù),必須放入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({
/****************************************表格數(shù)據(jù)加載****************************************************/
"serverSide": true,
"ajax": {//ajax請求數(shù)據(jù)源
"url": "/UserInfo/Manager/Search",
"type": "post",
"data": function (data) {//添加額外的數(shù)據(jù)給服務(wù)器
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是有多少列就執(zhí)行多少次方法。。。不知道為啥
return "<input type='checkbox' value='" + data + "' name='UserInfoId'>";
}
},
{
"targets": [4],
"data": "AddTime",
"render": function (data, type, full) {//全部列值可以通過full.列名獲取,一般單個列值用data PS:這里的render是有多少列就執(zhí)行多少次方法。。。不知道為啥
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是有多少列就執(zhí)行多少次方法。。。不知道為啥
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是有多少列就執(zhí)行多少次方法。。。不知道為啥
if (data) { return "是"; }
else { return "否"; }
}
},
{
"targets": [7],
"data": "UserInfoId",
"render": function (data, type, full) {//全部列值可以通過full.列名獲取,一般單個列值用data PS:這里的render是有多少列就執(zhí)行多少次方法。。。不知道為啥
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) { //表格初始化完成后調(diào)用
},
/****************************************表格數(shù)據(jù)加載****************************************************/
/****************************************表格樣式控制****************************************************/
"dom": "t<'dataTables_info'il>p",//表格布局
"language": {//語言國際化
"lengthMenu": "每頁 _MENU_ 條",
"zeroRecords": "沒有找到記錄",
"info": "當(dāng)前顯示 _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服務(wù)代碼************************/
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格式的數(shù)據(jù)(DT參數(shù)區(qū)分大小寫)
/// </summary>
public class DataTable
{
/// <summary>
/// 請求次數(shù)(前端==》后端)
/// </summary>
public int draw { get; set; }
/// <summary>
/// 總記錄數(shù)(前端《==后端)
/// </summary>
public int recordsTotal { get; set; }
/// <summary>
/// 過濾后的總記錄數(shù)(前端《==后端)
/// </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>
/// 集合分頁數(shù)據(jù)(前端《==后端)
/// </summary>
public IList data { get; set; }
}
}
這樣就搞定了。。。是不是很簡單(● ̄(エ) ̄●)
╮(╯_╰)╭好的,我來解釋下。
前臺:
首先我們的table只是給出了thead部分,那么tbody部分呢?交給DT來完成,由DT來控制。那么我們先來初始化DT,js會調(diào)用initializeTable()方法,方法里調(diào)用$("#table1").DataTable({各種配置});來配置DT。至于這些配置的作用,我代碼里都做了注釋,詳細(xì)的配置解釋,可以查看官網(wǎng)的文檔。
配置里有一項很重要,就是ajax配置項,這里是數(shù)據(jù)源的配置項,數(shù)據(jù)源可以有多種,我這里選用了ajax異步請求數(shù)據(jù)源。
"url": "/UserInfo/Manager/Search"這個是配置了DT請求數(shù)據(jù)的url地址
"type": "post"指明了以post方式發(fā)送請求
"data":
function (data) {
//添加額外的數(shù)據(jù)給服務(wù)器
data.pageIndex = (data.start / data.length) + 1;
data.nickname = $("#nickname").val().trim();
}
這了由于我用到了搜索的功能,所以每次請求數(shù)據(jù)的時候,要把搜索的條件作為附加的數(shù)據(jù)傳給服務(wù)器
最后,注意要加上"serverSide": true,因為我們的數(shù)據(jù)都是從后臺過來的,不是前臺的靜態(tài)數(shù)據(jù),要開啟“服務(wù)器模式”,這樣,你每次對表格的操作,都會變成一次次的請求發(fā)送給服務(wù)器。
后臺:
后臺負(fù)責(zé)提供數(shù)據(jù)源,使用自定義的DataTable類來作為格式化的數(shù)據(jù)進(jìn)行交互。當(dāng)然這里的DataTable類不是必須的,你只要滿足前后數(shù)據(jù)交互的格式就可以,這里封裝成一個類,是為了方便。
DT建議我們交互的數(shù)據(jù)格式,最起碼要包含以下幾項,我用匿名類來表示(區(qū)分大小寫):
new {
draw=***,
recordsTotal=***,
recordsFiltered=***,
data=***,
}
其他項的話,你可以根據(jù)自己的實際情況自行添加。
準(zhǔn)備好了數(shù)據(jù)之后呢,把數(shù)據(jù)Json序列化后,返回給前端,即可。
效果圖:

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- jquery dataTable 獲取某行數(shù)據(jù)
- jQuery使用DataTable實現(xiàn)刪除數(shù)據(jù)后重新加載功能
- bootstrap jquery dataTable 異步ajax刷新表格數(shù)據(jù)的實現(xiàn)方法
- 利用JQuery實現(xiàn)datatables插件的增加和刪除行功能
- jQuery.datatables.js插件用法及api實例詳解
- jquery datatable服務(wù)端分頁
- jquery表格datatables實例解析 直接加載和延遲加載
- jQuery插件dataTables添加序號列的方法
- jQuery Datatable 多個查詢條件自定義提交事件(推薦)
相關(guān)文章
與jquery serializeArray()一起使用的函數(shù),主要來方便提交表單
與jquery serializeArray()一起使用的函數(shù),主要來方便提交表單,需要的朋友可以參考下。2011-01-01
JQuery Mobile實現(xiàn)導(dǎo)航欄和頁腳
導(dǎo)航欄由一組水平排列的鏈接構(gòu)成,通常位于頁眉或頁腳內(nèi)部。本文給大家介紹JQuery Mobile實現(xiàn)導(dǎo)航欄和頁腳的相關(guān)知識,需要的朋友參考下吧2016-03-03

