ASP.NET Core AJAX传递JSON模型到控制器参数始终为null排查
问题根因
- 前端AJAX配置与实际传参格式不匹配:代码中声明了
contentType: 'application/json; charset=utf-8',说明要向控制器传递JSON格式的请求体,但实际传参时直接把{ queryDetails }对象传给了data属性,jQuery默认会将该对象序列化为application/x-www-form-urlencoded格式的表单参数(也就是调试捕获到的键值对拼接格式),同时还多套了一层queryDetails的外层键,和控制器需要的QueryModel结构不匹配,模型绑定失败就会返回null。 - 路由配置冗余:Startup中配置的路由把
queryDetails设为了路由参数,但接口是通过[FromBody]从请求体取参数,该路由配置完全无效,不影响本次问题但建议清理。
解决方法
方案1:保持JSON传参(推荐)
仅修改前端AJAX的传参逻辑,把queryDetails对象直接序列化为JSON字符串即可,不需要套外层对象:
$.ajax({ type: 'POST', url: '/Home/SummaryRefresh', contentType: 'application/json; charset=utf-8', dataType: 'json', // 仅修改本行,直接序列化queryDetails对象 data: JSON.stringify(queryDetails), success: function () { }, error: function (error) { alert(error); } });
控制器代码无需修改。
方案2:使用表单格式传参
如果不需要用JSON传参,可以修改控制器去掉[FromBody]注解,同时删掉AJAX里的contentType配置:
$.ajax({ type: 'POST', url: '/Home/SummaryRefresh', dataType: 'json', data: queryDetails, success: function () { }, error: function (error) { alert(error); } });
控制器对应调整:
[HttpPost] public IActionResult SummaryRefresh(QueryModel queryDetails) { // 原有逻辑不变 if (queryDetails != null) { ViewData["QueryData"] = queryDetails; return View("Summary"); } else return BadRequest("Error refreshing view"); }
内容的提问来源于stack exchange,提问作者JeremyK
相关产品推荐
相关产品推荐

