如何配置数据表以使用页码而不是开始记录

How to configure DataTables to work with Page Number instead of Start record

我有一个现有的 Web 应用程序,当前使用 jqGrid 和整个服务器端后端 returns 基于页码和页长的分页信息。 现在我想在某些部分开始使用 DataTables,并且由于它的分页使用开始记录和长度,我想知道是否有某种方法可以配置 DataTables 以接受页码,这样我就不必修改我的整个后端。

有什么方法可以为此配置或调整 DataTables 吗?

编辑:为了避免混淆,我说的是具有服务器端处理功能的数据表,而不是客户端分页。

编辑 2:添加一些关于我的后端如何接受和响应来自浏览器的请求的代码。这是 ASP.NET MVC4.

我的服务总是响应正在使用的实体的数据页面,方法如下:

Page<T> GetPage<TKey>(int pageNumber,
                      int pageSize,
                      Expression<Func<T, TKey>> orderBy,
                      bool ascending = true,
                      Expression<Func<T, bool>> predicate = null)

这将 return 一个像这样的 Page<T> 对象:

public class Page<T> : IEnumerable<T>
{
    private readonly IList<T> _items;

    public IList<T> Items
    {
        get { return _items; }
    }

    public Page()
    {}

    public Page(int currentPage, IEnumerable<T> items, int itemsPerPage, int totalItems, int totalPages)
    {
        PageIndex = currentPage;
        _items = items.ToList();
        TotalItems = totalItems;
        PageSize = itemsPerPage;
        TotalPages = totalPages;
    }

    public int PageIndex { get; private set; }
    public int PageSize { get; private set; }
    public int TotalItems { get; private set; }
    public int TotalPages { get; private set; }

    public IEnumerator<T> GetEnumerator()
    {
        return _items.GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}

然后在 returning 动作响应时在控制器中将其解析为 Json 以匹配网格插件所需的 json 结构(而它是 jqGrid或数据表)。

我无法更改页面结构和分页机制,因为它会对 Web 应用程序产生巨大影响,因此不在讨论之列。我需要找到一种方法来调整 DataTables,以便它发送 PageNumber 而不是 Start 记录。 Length 参数将与我这边的 PageSize 相匹配,因此它非常适合。

您可以使用ajax.data 属性修改提交到服务器的数据。

$('#example').dataTable( {
   "processing": true,
   "serverSide": true,
   "ajax": {
      "url": "script.php",
      "data": function(d, settings){
         var api = new $.fn.dataTable.Api(settings);

         // Convert starting record into page number
         d.pageNumber = Math.min(
            Math.max(0, Math.round(d.start / api.page.len())),
            api.page.info().pages
         );
      }
   }
});