You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 12:40:34