添加日期过滤后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
相关产品推荐
相关产品推荐

