JqueryDataTable的使用(.Net平台)

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

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

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

js:jq+jquery.dataTables.min.js

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

前端代码:

  1 @{
  2     Layout = null;
  3 }
  4 <!DOCTYPE html>
  5
  6 <html>
  7 <head>
  8     <meta charset="utf-8">
  9     <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
 10     <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no" />
 11     <title>用户列表</title>
 12     <link href="~/Content/Scripts/h-ui/css/H-ui.min.css" rel="stylesheet" />
 13     <link href="~/Content/Scripts/h-ui.admin/css/H-ui.admin.css" rel="stylesheet" />
 14     <link href="~/Content/Scripts/Hui-iconfont/1.0.8/iconfont.css" rel="stylesheet" />
 15
 16     <style>
 17         .page-container {
 18             padding: 10px;
 19         }
 20
 21         .operation {
 22             background: #EFEEF0;
 23             padding: 3px;
 24         }
 25
 26         .search {
 27             background: #EFEEF0;
 28             padding: 5px;
 29             margin-top: 5px;
 30         }
 31
 32         .table {
 33             margin-top: 10px;
 34         }
 35
 36         .dataTables_info {
 37             margin-left: 5px;
 38         }
 39
 40         #table1_info {
 41             padding: 0;
 42         }
 43
 44         #table1_length {
 45             margin-left: 15px;
 46         }
 47     </style>
 48     <!--引入脚本解决兼容性(hack技术,必须放入head中)-->
 49     <!--[if lt IE 9]>
 50     <script src="~/Content/Scripts/html5_css3/html5shiv.min.js"></script>
 51     <script src="~/Content/Scripts/html5_css3/respond.min.js"></script>
 52     <script src="~/Content/Scripts/PIE-2.0beta1/PIE_IE678.js"></script>
 53     <![endif]-->
 54 </head>
 55 <body>
 56     <div class="page-container">
 57         <div class="operation">
 58             <a class="btn btn-danger radius" href="javascript:;"><i class="Hui-iconfont"></i> 批量删除</a>
 59             <a class="btn btn-primary radius" href="javascript:;"><i class="Hui-iconfont"></i> 添加用户</a>
 60         </div>
 61
 62         <div class="search">
 63             <input type="text" id="nickname" class="input-text" style="width:100px;" placeholder="昵称">
 64             <button id="search" class="btn btn-success" type="submit"><i class="Hui-iconfont"></i> 查询</button>
 65         </div>
 66
 67         <div class="table">
 68             <table id="table1" class="table table-border table-bordered table-bg table-hover">
 69                 <thead>
 70                     <tr class="text-c">
 71                         <th><input type="checkbox" name="" value=""></th>
 72                         <th>昵称</th>
 73                         <th>账号</th>
 74                         <th>密码</th>
 75                         <th>添加时间</th>
 76                         <th>修改时间</th>
 77                         <th>是否禁用</th>
 78                         <th>操作</th>
 79                     </tr>
 80                 </thead>
 81             </table>
 82         </div>
 83     </div>
 84 </body>
 85 </html>
 86 <script src="~/Content/Scripts/jquery-2.0.3.min.js"></script>
 87 <script src="~/Content/Scripts/datatables/1.10.13/jquery.dataTables.min.js"></script>
 88 <script src="~/Content/Scripts/h-ui/js/H-ui.js"></script>
 89 <script src="~/Content/Scripts/h-ui.admin/js/H-ui.admin.js"></script>
 90
 91 <script type="text/javascript">
 92     var table1 = null;
 93     $(function() {
 94         table1=initializeTable();
 95         $("#search").click(function() {
 96             table1.ajax.reload();
 97         });
 98     });
 99
100     function initializeTable() {//初始化table
101         var table = $("#table1").DataTable({
102             /****************************************表格数据加载****************************************************/
103             "serverSide": true,
104             "ajax": {//ajax请求数据源
105                 "url": "/UserInfo/Manager/Search",
106                 "type": "post",
107                 "data": function (data) {//添加额外的数据给服务器
108                     data.pageIndex = (data.start / data.length) + 1;
109                     data.nickname = $("#nickname").val().trim();
110                 }
111             },
112             "columns": [//列绑定
113                 { "defaultContent": "" },
114                 { "data": "Nickname" },
115                 { "data": "LoginName" },
116                 { "data": "LoginPassword" },
117                 { "data": "AddTime" },
118                 { "data": "ModifyTime" },
119                 { "data": "IsForbidden" },
120                 { "defaultContent": "" }
121             ],
122             "columnDefs": [//列定义
123                 {
124                     "targets": [0],
125                     "data": "UserInfoId",
126                     "render": function (data, type, full) {//全部列值可以通过full.列名获取,一般单个列值用data PS:这里的render是有多少列就执行多少次方法。。。不知道为啥
127                         return "<input type=‘checkbox‘ value=‘" + data + "‘ name=‘UserInfoId‘>";
128                     }
129                 },
130                 {
131                     "targets": [4],
132                     "data": "AddTime",
133                     "render": function (data, type, full) {//全部列值可以通过full.列名获取,一般单个列值用data PS:这里的render是有多少列就执行多少次方法。。。不知道为啥
134                         if (data == null || data.trim() == "") { return ""; }
135                         else { var date = new Date(parseInt(data.slice(6))); return date.getFullYear() + "/" + date.getMonth() + "/" + date.getDate(); }
136                     }
137                 },
138                 {
139                     "targets": [5],
140                     "data": "ModifyTime",
141                     "render": function (data, type, full) {//全部列值可以通过full.列名获取,一般单个列值用data PS:这里的render是有多少列就执行多少次方法。。。不知道为啥
142                         if (data == null || data.trim() == "") { return "/"; }
143                         else { var date = new Date(parseInt(data.slice(6))); return date.getFullYear() + "/" + date.getMonth() + "/" + date.getDate(); }
144                     }
145                 },
146                 {
147                     "targets": [6],
148                     "data": "IsForbidden",
149                     "render": function (data, type, full) {//全部列值可以通过full.列名获取,一般单个列值用data PS:这里的render是有多少列就执行多少次方法。。。不知道为啥
150                         if (data) { return "是"; }
151                         else { return "否"; }
152                     }
153                 },
154                 {
155                     "targets": [7],
156                     "data": "UserInfoId",
157                     "render": function (data, type, full) {//全部列值可以通过full.列名获取,一般单个列值用data PS:这里的render是有多少列就执行多少次方法。。。不知道为啥
158                         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>" +
159                             "<a style=‘text-decoration:none‘ class=‘ml-5 f-14‘ onclick=article_del(this,‘" + data + "‘) href=‘javascript:;‘ title=‘删除‘><i class=‘Hui-iconfont‘></i></a>";
160                     }
161                 },
162
163                 { "orderable": false, "targets": [0, 7] },// 是否排序
164                 //{ "visible": false, "targets": [3, 5] }//是否可见
165             ],
166             "rowCallback": function (row, data, displayIndex) {//行定义
167                 $(row).attr("class", "text-c");
168             },
169             "initComplete": function (settings, json) { //表格初始化完成后调用
170
171             },
172             /****************************************表格数据加载****************************************************/
173             /****************************************表格样式控制****************************************************/
174             "dom": "t<‘dataTables_info‘il>p",//表格布局
175             "language": {//语言国际化
176                 "lengthMenu": "每页 _MENU_ 条",
177                 "zeroRecords": "没有找到记录",
178                 "info": "当前显示 _START_ 到 _END_ 条,共 _TOTAL_条",
179                 "infoEmpty": "无记录",
180                 "paginate":
181                 {
182                     "first": "首页",
183                     "previous": "前一页",
184                     "next": "后一页",
185                     "last": "末页"
186                 }
187             },
188             "pagingType": "full_numbers",//分页格式
189             "processing": true,//等待加载效果
190             "ordering": false,//排序功能
191             /****************************************表格样式控制****************************************************/
192         });
193         return table;
194     }
195 </script>

 后端代码:

 1 /****************Controller后台代码******************/
 2 public ActionResult Search(DataTable dt,string nickname)
 3         {
 4             int total;
 5             int pageSize = dt.length;
 6             int pageIndex = dt.pageIndex;
 7
 8             IQueryable<Model.UserInfo> userInfoIq=CurrentBllSession.UserInfoBll.GetIQueryableBySearchPage(pageIndex,pageSize,out total,nickname);
 9             List<Model.UserInfo> userInfoList = userInfoIq.ToList();
10             dt.recordsTotal = total;
11             dt.recordsFiltered = total ;
12             dt.data = userInfoList;
13
14             return Json(dt);
15         }
16
17
18 /**************************Bll服务代码************************/
19  public IQueryable<UserInfo> GetIQueryableBySearchPage(int pageIndex,int pageSize,out int total,string nickname)
20         {
21             IQueryable<UserInfo> userInfoIq= CurrentDal.GetIQueryable();
22
23             if (!string.IsNullOrEmpty(nickname))
24             {
25                 userInfoIq=userInfoIq.Where(a => a.Nickname.Contains(nickname));
26             }
27             total=userInfoIq.Count();
28             userInfoIq=userInfoIq.OrderByDescending(a => a.AddTime);
29             userInfoIq=userInfoIq.Skip((pageIndex - 1)*pageSize).Take(pageSize);//分页前必须排序,不然EF报错
30
31             return userInfoIq;
32         }

 1 using System;
 2 using System.Collections;
 3 using System.Collections.Generic;
 4 using System.Linq;
 5 using System.Text;
 6
 7 namespace ViewModel
 8 {
 9     /// <summary>
10     /// JqueryDataTable插件交互的DT格式的数据(DT参数区分大小写)
11     /// </summary>
12     public class DataTable
13     {
14         /// <summary>
15         /// 请求次数(前端==》后端)
16         /// </summary>
17         public int draw { get; set; }
18
19         /// <summary>
20         /// 总记录数(前端《==后端)
21         /// </summary>
22         public int recordsTotal { get; set; }
23
24         /// <summary>
25         /// 过滤后的总记录数(前端《==后端)
26         /// </summary>
27         public int recordsFiltered { get; set; }
28
29         /// <summary>
30         /// 记录开始索引(前端==》后端)
31         /// </summary>
32         public int start { get; set; }
33
34         /// <summary>
35         /// PageIndex(前端==》后端)
36         /// </summary>
37         public int pageIndex { get; set; }
38
39         /// <summary>
40         /// PageSize(前端==》后端)
41         /// </summary>
42         public int length { get; set; }
43
44         /// <summary>
45         /// 集合分页数据(前端《==后端)
46         /// </summary>
47         public IList data { get; set; }
48     }
49 }

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

╮(╯_╰)╭好的,我来解释下。

前台:

首先我们的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序列化后,返回给前端,即可。

效果图:

时间: 2024-08-05 14:59:03

JqueryDataTable的使用(.Net平台)的相关文章

谭八爷代理订货平台系统

谭八爷代理订货平台系统  135.3879.3268   谭八爷微商下单系统.谭八爷微商管理系统.谭八爷代理商下单系统等.模式系统开发 传统行业和内容提供本质没有变,但是在结合互联网后的商业模式和运营模式变了,如当前我们谈的多的O2O,核心不是内容提供变化了,是商业模式变化了,这个商业模式变化本身又依托了一个重要假设,即解决了传统行业原有的信息不对称问题. 谭八爷微商平台系统开发的注册流程是非常简单的--扫码注册.同时后台的功能也很强大,代理们收到顾客订单后可以直接在后台向公司下单,同时后台也会

家电二维码售后服务平台系统开发

家电二维码售后服务平台系统开发,家电二维码售后系统开发,小吴183.2071.6434微电,家电二维码售后软件开发,家电二维码售后平台开发. 互联网平台的节点有两大类型:第一基数节点,也就是弱连接的节点,其规模要大,越大越好,互联网的价值与节点数的平比成正比.第二活跃节点,也就是强连接的节点,其能量要强,越强越好,互联网的价值与其强度成正比. 一.家电维修行业"维修黑幕"层出不穷 记者从一位从事家电维修人士那里了解到,目前行业公认当前家电维修行业有陷阱,"维修黑幕"

category is in invalid format hint微信第三方平台将第三方提交的代码包提交审核出错

微信第三方平台通过接口https://api.weixin.qq.com/wxa/submit_audit?access_token=TOKEN将第三方提交的代码包提交审核时一直返回错误码85008的错误信息: category is in invalid format hint 查了半天是接口提交数据时json_encode时中文不能编码提交 将向微信的提交代码     $this->https_post($url,json_encode($postData)); 改为     $this->

基于Spark MLlib平台的协同过滤算法---电影推荐系统

基于Spark MLlib平台的协同过滤算法---电影推荐系统 又好一阵子没有写文章了,阿弥陀佛...最近项目中要做理财推荐,所以,回过头来回顾一下协同过滤算法在推荐系统中的应用. 说到推荐系统,大家可能立马会想到协同过滤算法.本文基于Spark MLlib平台实现一个向用户推荐电影的简单应用.其中,主要包括三部分内容: 协同过滤算法概述 基于模型的协同过滤应用---电影推荐 实时推荐架构分析     一.协同过滤算法概述 本人对算法的研究,目前还不是很深入,这里简单的介绍下其工作原理. 通常,

ZYNQ 7000平台UDP数据包(1字节或2字节)校验和Checksum错误0xFFFF解决方案(linux+vxworks6.9平台)

在赛灵思ZYNQ 7000平台,使用UDP方式发送1字节或者2字节数据时,校验和为错误值0xffff,接收机无法正常接收ZYNQ7000平台发送的数据,本人已经找到该问题的解决方案,有该问题的朋友可以通过邮箱[email protected]与我联系,联系时请详细描述你的环境,针对该咨询提供的问题解决方案会收取一定的费用,费用不会太高,现在是知识付费的年代,希望各位理解,同时如果能够解决您的问题,也是为你节约了开支.我会及时回复邮件的.具体事项可以邮件沟通[email protected].

微信公众平台的最新功能详细介绍与使用技巧!

近日微信官方发布消息,微信公众平台的操作进行了又一次"感天动地"的更新 且听我一一道来 本次主要重要改(Geng)革(Xin)凸显在三个地方 改(Geng)革(Xin)一:图文模版的收藏与使用 这,真的是一个超级实用的功能呀,那么如何使用呢?在哪里找呢? 首先告诉大家,如何收藏图文模板 选中编辑区的部分或者全部素材,然后点击添加模版,图文模板即可收藏成功: 当然,你还可以从外部进行粘贴和复制内容到图文模版. 那么,在哪里找到我收藏的模版呢?? 嗯,就在添加图文模版的旁边啦! 同时,你还

政府部门没组织机构代码、法人证书,怎么开通认证微信公众平台?

政府机关微信公众号认证流程:1.确定需要认证的名字:如xx大队.xx局:2.准备资料:单位证件.运营人身份证.联系手机.登陆邮箱:3.确定类型:订阅号or服务号:资料准备好后,可直接联系公众平台服务商"杰客科技"的客服人员,2天内便可完成认证. 注意事项:1.政府机关认证时需要盖章,没有公章将无法认证:2.公众号认证后,排名将更靠前并显示v标志. 政府微信公众平台开通及认证:http://www.jcjclu.com/apply/201603149.html客服QQ:180805782

微信公众平台开发—利用OAuth2.0获取微信用户基本信息

1.首先在某微信平台下配置OAuth2.0授权回调页面: 2.通过appid构造url获取微信回传code值(appid可在微信平台下找到) 1).微信不弹出授权页面url: A.code回传到页面wxProcess2.aspx,不带参数 [csharp] view plain copy Response.Redirect("https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + appid + "&

用gson和httpclient调用微信公众平台API

吐槽:微信api很无语,部分用xml,部分用json. 最近在找如何调用微信公众平台关于json相关的api比较方便,最后发现httpcliect和gson不错.如果你有更好的方式,请告诉我. 以下代码先了解如何使用gson和httpclient,有功夫再整到我的sophia里 import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.