JQuery DataTables服务端分页draw值错误致跨页跳转异常求助
DataTables服务端分页跳页错误修复方案
问题核心
你的分页错误源于后端误用了draw参数计算分页偏移量。draw是DataTables用来标识请求顺序的自增计数器,和页码没有直接关联。当直接跳页时,draw的数值不等于目标页码,导致计算出的偏移量错误,从而显示错误的页面数据。
修改思路及代码调整
1. 恢复并使用start参数
DataTables在服务端分页请求中,会通过start参数传递当前页需要跳过的记录总数(比如第3页、每页5条时,start的值是10),这才是计算分页偏移的正确参数。
修改后端代码如下:
int siteID = (Session["SiteID"] != null)? (int)Session["SiteID"] : 0; if (siteID == 0) { siteID = (int)this.DetermineSiteID(); Session["SiteID"] = siteID; } var draw = Request.Form["draw"].FirstOrDefault().ToString(); // 恢复start参数的读取 var start = Request.Form["start"].FirstOrDefault().ToString(); var length = Request.Form["length"].FirstOrDefault().ToString(); var sortColumn = Request.Form["columns[" + Request.Form["order[0][column]"].FirstOrDefault() + "][name]"].FirstOrDefault().ToString(); var sortColumnDirection = Request.Form["order[0][dir]"].FirstOrDefault().ToString(); var searchValue = Request.Form["search[value]"].FirstOrDefault().ToString(); int pageSize = length != null? Convert.ToInt32(length) : 0; // 直接用start作为skip值,无需通过draw计算 int skip = start != null? Convert.ToInt32(start) : 0; int recordsTotal = 0; var userData = rule.GetVisitorSummerybyDates(DateTime.Parse(toDate), DateTime.Parse(fromDate), siteID.ToString()); if (!string.IsNullOrEmpty(searchValue) && searchValue != "\0") { userData = (List<VisitorInOutDetails>)userData.Where( m => m.IDNumber.Contains(searchValue) || m.ContactNumber.Contains(searchValue) || m.Company.Contains(searchValue)); } recordsTotal = userData.Count(); // 直接使用skip变量,删除原有用draw计算的错误逻辑 var data = userData.Skip(skip).Take(pageSize).ToList(); var jsonData = new { draw = draw, recordsFiltered = recordsTotal, recordsTotal = recordsTotal, data = data }; return Json(jsonData);
2. 前端代码无需修改
你的前端DataTables配置是正确的,serverSide: true已经会自动传递start、length等分页参数,不需要额外调整。
验证逻辑
修改后,当你点击第3页时,前端会传递start=10(每页5条),后端直接跳过10条记录,取接下来的5条,正好是第3页的数据,跳页功能就能正常工作了。
内容的提问来源于stack exchange,提问作者pl-jay
相关产品推荐
相关产品推荐

