我有一个当前使用jqGrid的现有Web应用程序,整个服务器端后端根据页码和页面长度返回分页信息。 现在我想开始在某些部分使用DataTables,并且由于它的分页使用了Start记录和Length,我想知道是否有某种方法可以配置DataTables来接受Page Number,所以我不必修改我的整个后端。
是否可以为此配置或调整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)
这将返回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();
}
}
然后在返回动作响应时将其解析为Controller中的Json,以匹配网格插件所需的json结构(而它是jqGrid或DataTables)。
我无法更改页面结构和分页机制,因为它会对Web应用程序产生巨大影响,因此无法进行讨论。我需要找到一种方法来调整DataTables,以便它发送 PageNumber 而不是 Start 记录。 Length 参数与我身边的 PageSize 匹配,因此非常适合。
答案 0 :(得分:4)
您可以使用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
);
}
}
});