微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

JQuery 数据表仅显示 10 行和 1 页,并且按钮在上一页和下一页被禁用

如何解决JQuery 数据表仅显示 10 行和 1 页,并且按钮在上一页和下一页被禁用

我使用 jquery 数据表来显示客户数据。我正在使用服务器端处理。但是我对如何使用recordsFilteredProperty 有点困惑。当我将它设置为客户表的总数时,一切都显示正常,但是当我滚动到第 2 页时,没有预期的数据。但是,如果我将 recordsFiltered 更改为 result.Count,那么我将显示 10 个中的 1 个,并且只有一页显示用于分页,并且上一个和下一个按钮被禁用。

这是我的MVC代码

 public IActionResult GetCustomers(DataTableAjaxPostModel model)
    {
        var totalCount = DatabaseLogic.GetCustomersCount();
        var filteredCount = totalCount;

        string sortBy = "";
        string sortDir = "";

        if (model.order != null)
        {
            sortBy = model.columns[model.order[0].column].data;
            sortDir = model.order[0].dir.ToLower();
        }
        
        totalCount = DatabaseLogic.GetCustomersCount();

        var search = model?.search?.value == "" ? "" :  model?.search?.value;

        int startRec = model.start;
        int pageSize = model.length;

        var result = DatabaseLogic.GetCustomers(startRec,pageSize,search,sortBy,sortDir);


        return Json(new { draw = model.draw,recordsTotal = totalCount,recordsFiltered = filteredCount,data = result });
    }

Datatables Screen Shot

解决方法

在使用DataTables服务器端处理时,有几点需要考虑正确处理分页控件和表格信息汇总。下面介绍一种基本方法。

我所说的“分页控件”指的是“第一”、“上一”、“下一”、“最后”和页码按钮。这些按钮的显示方式是configurable - 但在这里我将假设默认值simple_numbers 选项。

“表格信息摘要”是指如下文本:

Showing 21 to 30 of 57 entries

如果应用了过滤器,则等效文本:

Showing 1 to 10 of 21 entries (filtered from 57 total entries) 

这些消息也可以使用 language.infolanguage.infoFiltered 进行配置。


有 4 个服务器端处理值控制上述行为:

在服务器的参数 sent from DataTables 中:

  • start - 要在表中显示的第一条记录的(从零开始的)索引。
  • length - 一页中可以显示的记录总数,通常由长度更改器下拉菜单控制。

在从服务器发送到 DataTables 的参数中(连同我们要显示的十条记录):

  • recordsTotal - 未过滤数据集中的记录总数(例如,这可能是源数据库表的行数)。
  • recordsFiltered - 应用任何过滤器后源数据集中的记录数。过滤器是在 DataTables 搜索输入字段中提供的过滤器。如果没有过滤器,或者过滤器不影响任何行,则该值将等于 recordsTotal

因此,如果 start = 20 和 length = 10,这意味着我们希望 DataTables 显示我们整个数据集(即第二页)中的第 21 到 30 行。因此,服务器会将这组特定的 10 条记录发送回 DataTables,以进行显示。

如果recordsTotal = 123,但过滤后只有77条相关记录,则recordsFiltered = 77。


但是,为了有效地使用上述数据,服务器还必须考虑到 DataTables 中的任何列排序设置。此信息也包含在 sent parameters 数据中,使用 order[i][column] 字段。

因此,服务器必须构建一个按要求过滤和排序的结果集。

此结果集中的记录数为 recordsFiltered 值。

结果集已排序这一事实允许服务器从结果集中选择正确的显示数据子集,如 startlength 值所指定。正是这个特定的数据片段在从服务器到 DataTables 的 JSON 响应中返回。

(这也是 DataTables 可以处理数百万条记录的原因,当使用服务器端处理时:对于每次渲染/绘图,它只接收整体数据的一小部分。)


这就留下了一个空白:recordsTotal 的值是多少?您如何确定这取决于具体的服务器端实现过程。

一种方法如下:

  1. 服务器构建一个 SQL 选择语句来检索排序和过滤的数据。
  2. 应用服务器层提取所需的显示数据子集。

在这种情况下,应用服务器需要发出第二条 SQL 语句来统计未过滤记录的总数。这为我们提供了 recordsTotal 值。

如果“两个查询”方法不切实际,可能还有其他实现方法。但是,上述方法将确保分页和信息功能按预期运行。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。