如何在MVC中动态设置DataTables的总记录数与筛选后记录数
解决DataTables动态设置recordsTotal和recordsFiltered的问题
当前控制器硬编码recordsTotal和recordsFiltered为固定值4218,导致前端DataTables分页、计数逻辑失效。要实现动态获取真实记录数,需从数据源拿到总条数,同时适配DataTables服务端分页的参数传递,步骤如下:
1. 修改控制器代码
核心调整三点:
- 接收DataTables服务端模式自动发送的
draw、start、length参数 - 获取未分页的真实总记录数,赋值给
recordsTotal和recordsFiltered(无额外筛选逻辑时两者值一致) - 根据前端传的分页参数做数据截取
修改后的控制器代码:
[CustomSecurityAttributes] public ActionResult GetAllNSLogDetails(int UserID, int draw, int start, int length) { JsonResult _json = new JsonResult(); NonconformingServiceManager _NSManager = new NonconformingServiceManager(); NSLog NSLog = new NSLog(); // 获取所有符合条件的原始数据(未分页) var allNSIssues = _NSManager.GetAllNSIssue(UserID); // 赋值总记录数与筛选后记录数(无筛选时两者相同) NSLog.recordsTotal = allNSIssues.Count(); NSLog.recordsFiltered = allNSIssues.Count(); // 按前端要求分页截取数据 NSLog.Customers = allNSIssues.Skip(start).Take(length).ToList(); // 回传前端传入的draw参数,必须一致 NSLog.draw = draw; // 计算总页数(可选,前端DataTables会自动处理分页逻辑) NSLog.PageCount = Convert.ToInt32(Math.Ceiling((double)NSLog.recordsTotal / length)); _json.Data = NSLog; _json.MaxJsonLength = int.MaxValue; return _json; }
2. 简化前端JS的Ajax配置
原dataFilter可移除,控制器返回的NSLog结构已符合DataTables服务端模式要求,只需指定数据来源:
修改后的Ajax片段:
ajax: { url: "/NonconformingService/GetAllNSLogDetails?UserID=" + userID, type: 'POST', datatype: "json", dataSrc: "Customers" // 直接指定数据数组来源 },
3. ViewModel无需修改
你的NSLog类已包含DataTables所需的全部字段(recordsTotal、recordsFiltered、draw、Customers),保持原样即可。
关键注意事项
draw参数必须原样回传,否则DataTables会判定请求无效- 后续添加筛选功能时,
recordsFiltered需改为筛选后的数据总数,recordsTotal始终保留原始总记录数 - 前端
serverSide: true必须保留,确保DataTables自动发送分页、排序、筛选参数到后端
内容的提问来源于stack exchange,提问作者Josh1669
相关产品推荐
相关产品推荐

