JQuery DataTables 服务端分页的实现(最新实例)

就我了解的来说,我还是想为这个插件正名 : DataTables 是一个特别强大的插件,它现有的API可以解决我所有的需求,而且异常便捷。

在我们数据量小的情况下 ,配合deferRender(延迟渲染),我们还可以考虑全部加载到浏览器中,在浏览器中实现分页。但是数据量大的时候,我们就不得不使用 服务端分页了。

这篇博文,我们就来说一下,JQuery DataTables 服务端分页的实现。

JS 基本配置 :

基本配置,我在上一篇博文中已经介绍了 JQuery DataTables插件使用说明(最新),在这里我们只介绍一下,服务端分页需要配置的参数。

//基本配置
$.fn.dtconfig = {
 "serverSide": true,  //开启服务器模式,必须

  processing: true,   //是否显示加载中提示,可缺省
 "paging": false,     //关闭本地分页,默认false,可缺省
 "pageLength" :10,    //每页长度,可缺省
 "pagingType": "full_numbers"  //分页布局样式,可缺省
}

//配置服务端请求(必须)
$.fn.dtconfig.ajax = { 
    url: '/UserManage/GetUserList',//请求地址
    type: 'Post',// 异步请求方式
    data:{},// 请求参数,可为静态参数,亦可谓动态参数

    // DataTables类库 很强大,提供了可配置的节点,也就是说,同一种功能,我们可以有多种选择去实现它。data这个参数就是个例子,我们可以使用data参数去设置我们的查询参数,但是查询的时候,是有其他实现方式的。
    // 在Data中添加参数后, 如:
    data:{"TestID":123}
    //testID 这个参数,将直接拼接到 请求表单中,下面我们分析的DataTables 请求表单的时候,会说到这个问题。 

};

Ajax Data 参数

这样 分页功能,我们就实现了,在我们点击 下一页的时候,插件就会发起一个我们配置好的请求。再配合后端,返回改页数据,我们的分页功能就完成了。

在这里,有一个重点,那就是 DataTables的请求, 下面我跟大家 详细的分析一下 DataTables 的请求表单

DataTables 的请求表单

这里涉及到一个知识点 ,DataTables 在发起异步请求的时候,有几个重要的参数:
draw,length ,start

请求表单的详情,可以参考 :JQuery DataTables 请求表单

/*参数说明*/

// draw 参数
draw: 1 // 这个参数需要 特别注意 ,draw 标识当前的绘制,服务端在接收到这个参数后,需要将这个参数返回,必须返回,而后客服端重新绘制表格后,这个参数会 + 1 ,表示已更新。


@start : int
//请求的起始行(比如:第一页: 0,第二页: 1*pagelength)
@length : int
//每页的长度
@search[value]:string
//:单独要查询的值
@search[regex]: true or false
//是否支持正则

DataTables 请求表单

分页后端实现(以ASP.NET MVC 为例)

在处理后端的时候,我利用了一下 “MVC 神奇的模型“,下面就是后端的逻辑,注释我已经写在里面了,不知道大家能不能看懂,我把几个重要的点说一下。

逻辑:

1. 接收DataTables请求参数(DataTableModel 类)

首先,我写了一个 DataTables的参数模型 (详情参考 DataTables 请求表单),我将请求的参数更新到了这个模型里。

2. 将DataTables 里的参数 转换为 查询条件
也就是TryUpdateUserModel的逻辑

3. 使用查询条件进行查询
配合 draw,start,length,还有我们的查询条件,进行分页查询,而后将 总数当前页数据,返回给客户端

  /// <summary>
  /// 分页获取用户列表
  /// </summary>
  /// <param name="form">请求表单</param>
  /// <returns></returns>
  public ActionResult GetUserList(FormCollection form)
  {
      //编写一个 DataTables请求的表单模型
      DataTableModel inModel = new DataTableModel();

      //将请求参数,更新到DataTableModel模型中
      if (!TryUpdateModel<DataTableModel>(inModel))
      {
          //模型绑定失败
          inModel.draw = Convert.ToInt32(form["draw"]);//重要参数
          inModel.start = Convert.ToInt32(form["start"]);//起始行
          inModel.length = Convert.ToInt32(form["length"]);//每页长度
      }
      //更新查询参数
      // 从DataTables 表单模型中,提取出要查询的参数来,放到userModel 查询条件中
      User userModel = TryUpdateUserModel(inModel);

      //执行分页查询
      try
      {
          int count = 0;
          List<User> ds = UserDB.GetUserListByParam(userModel, out count, inModel.start, inModel.length);
          return Json(new
          {
              draw = inModel.draw,//注意这个参数,一定要回传
              recordsTotal = count,//这个参数也特别重要,标识了全部数量,有这个参数,客户端才能确定分成多少页
              recordsFiltered = count,//过滤查询后的数量
              data = ds,//  该页的数据
          });
      }
      catch(Exception e)
      {
          return Json(new
          {
              draw = inModel.draw,
             error = "加载失败,请重试!"
          });
      }

  }
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace UMSystem.Models
{
    /// <summary>
    /// datatables 组件参数模型(部分)
    /// </summary>
    [Serializable]
    public class DataTableModel
    {
        /// <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<ColumnsDetail> columns { get; set; }

        /// <summary>
        /// 搜索
        /// </summary>
        public ColumnsSearch search { get; set; }
    }

    [Serializable]
    public class ColumnsDetail
    {
        public string name { get; set; }
        public string data { get; set; }
        public bool searchable { get; set; }
        public bool orderable { get; set; }
        public ColumnsSearch search { get; set; }
    }

    [Serializable]
    public class ColumnsSearch
    {
        public string value { get; set; }
        public bool regex { get; set; }
    }

}
  /// <summary>
  /// 更新查询条件
  /// 根据DataTable查询参数
  /// </summary>
  /// <param name="inModel">DataTable查询参数</param>
  /// <returns>用户模型</returns>
  private User TryUpdateUserModel(DataTableModel inModel)
  {
      try
      {
          User outModel = new User();
          foreach (var item in inModel.columns)
          {
              switch (item.name)
              {
                  case "Name":
                      outModel.Name = item.search.value;
                      break;
                  case "ClassID":
                      outModel.ClassID =Convert.ToInt32(item.search.value);
                      break;
              }
          }
          return outModel;

      }
      catch
      {
          return new User();
      }   
  }
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
jQuery DataTables 是一个强大的表格插件,可以帮助开发人员快速实现功能丰富的数据表格。 首先,在使用这个插件之前,需要在项目中引入 jQueryDataTables 的相关文件。可以通过将它们下载到本地并引用,或者使用 CDN 服务引用它们。 一旦引入了必要的文件,就可以开始使用 DataTables。 首先,需要将 HTML 表格元素转换成 DataTables,可以使用如下方式: ```javascript $(document).ready(function() { $('#myTable').DataTable(); }); ``` 上述代码将选择具有 id 为 "myTable" 的表格元素,并将其转换为 DataTables。 接下来,可以在 DataTables 中配置各种选项,以满足项目的需求。例如,可以设置表格的列宽度、排序方式、是否显示搜索框等等。可以通过在 DataTables 初始化函数中传递一个配置对象来实现这些功能。例如: ```javascript $(document).ready(function() { $('#myTable').DataTable({ "columnDefs": [ { "width": "20%", "targets": 0 }, // 设置第一列的宽度为20% { "orderable": false, "targets": 2 } // 第三列禁止排序 ], "searching": false // 禁用搜索框 }); }); ``` 除了基本的配置选项外,DataTables 还提供了许多其他功能,例如分页、导出数据、自定义过滤等等。这些功能可以通过配置项或使用插件来实现DataTable还提供了许多API方法,可以进行表格的操作,如添加、删除、更新数据等。例如,可以使用 `row().data()` 方法获取表格的某一行数据,并对其进行修改。 上述是对 jQuery DataTables 的简要介绍,它为我们提供了一种简单高效的方式来管理和操作数据表格,帮助我们快速构建功能丰富的表格界面。通过深入学习官方文档和示例,掌握其更多高级用法,可以更好地利用该插件来满足各类项目的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值