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

添加日期过滤后Datatable报Value cannot be null错误,定位到draw行

解决Datatable添加日期范围过滤后出现“Value cannot be null (draw datatable)”错误的问题

这个错误我之前也遇到过,核心原因就是后端没法正常获取Datatable要求的draw参数了,大概率是添加日期过滤时破坏了前端请求的参数传递逻辑,或者后端的参数接收方式没跟上变化。下面给你一步步排查和解决的方案:

1. 先检查前端Datatable的AJAX配置

添加日期过滤时,很容易不小心覆盖了Datatable默认的参数传递逻辑。确保你的AJAX配置是在原有参数基础上追加日期参数,而不是重新定义整个data对象:

$('#yourTableId').DataTable({
    ajax: {
        url: '/YourController/GetList',
        type: 'POST',
        data: function(d) {
            // 只追加日期过滤参数,不要修改或删除d里的原有属性
            d.DateMin = $('#DateMinInput').val();
            d.DateMax = $('#DateMaxInput').val();
        }
    },
    // 保留你原来的排序、分页等配置
    ordering: true,
    paging: true
});

另外,确认请求的contentType是Datatable默认的application/x-www-form-urlencoded,如果改成了application/json,后端就不能用Request.Form来取参数了。

2. 修复后端获取draw参数的逻辑

原代码里直接用Request.Form.GetValues("draw").FirstOrDefault()很容易出现空引用,先做个空值判断:

// 先判断参数是否存在,避免空引用
var drawParam = Request.Form.GetValues("draw");
var draw = drawParam != null ? drawParam.FirstOrDefault() : "1";

// 或者更简洁的写法
var draw = Request.Form["draw"].FirstOrDefault() ?? "1";

如果前端是用JSON格式发送请求(比如你手动设置了contentType: 'application/json'),那得改成模型绑定的方式接收所有参数:
首先定义一个接收模型:

public class DatatableQueryRequest
{
    public int draw { get; set; }
    public int start { get; set; }
    public int length { get; set; }
    // 可以加上Datatable需要的order、search等属性
    public string DateMin { get; set; }
    public string DateMax { get; set; }
}

然后修改控制器方法:

[HttpPost]
public ActionResult GetList([FromBody] DatatableQueryRequest request)
{
    var draw = request.draw;
    // 处理日期过滤
    DateTime? dateMin = string.IsNullOrEmpty(request.DateMin) ? null : DateTime.Parse(request.DateMin);
    DateTime? dateMax = string.IsNullOrEmpty(request.DateMax) ? null : DateTime.Parse(request.DateMax);

    // 你的数据查询逻辑,加入日期过滤条件
    List<Réception_trains> listconsom = db.Réception_trains
        .Where(t => (!dateMin.HasValue || t.Date >= dateMin) && (!dateMax.HasValue || t.Date <= dateMax))
        .ToList();

    // 必须返回符合Datatable要求的JSON格式
    return Json(new {
        draw = draw,
        recordsTotal = db.Réception_trains.Count(),
        recordsFiltered = listconsom.Count,
        data = listconsom
    });
}

3. 用浏览器调试工具验证请求

打开浏览器F12的Network标签,找到发送给GetList的POST请求,查看Form Data(或Payload)里有没有draw参数:

  • 如果没有draw参数:说明前端AJAX配置有问题,没有正确传递Datatable的默认参数,回到第一步检查代码。
  • 如果有draw参数但后端取不到:大概率是Content-Type不匹配,前端发送的是JSON但后端用Request.Form接收,调整前端的contentType或者后端的接收方式即可。

内容的提问来源于stack exchange,提问作者M.LOOK

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:09:45