Ajax POST至控制器后,带[FromBody]的Controller参数为null
模型绑定失败,控制器接收的UserWarningMsg对象始终为null
我有一个控制器方法,接收UserWarningMsg类型的模型参数,使用Ajax向该方法POST数据。
控制器方法代码:
public async Task<ActionResult> EditMessageEffectiveDate([FromBody] Models.ViewModels.UserWarningMsg msg){ ... }
我在方法开头设置断点,发现Ajax提交后,msg对象始终为null。Ajax代码如下:
function onEditEffectiveDate(e) { var grid = $("#WarningMessagesGrid").data("kendoGrid"); var tr = $(e.target).closest("tr"); var targetRow = grid.dataItem(tr); console.log(JSON.stringify(targetRow)); // 输出内容见下文 $.ajax({ type: 'POST', url: '@Url.Action("EditMessageEffectiveDate", "UserWarningMessages")', contentType: "application/json;", dataType: "json", data: { 'msg': JSON.stringify(targetRow) }, success: function (data) { ... } }); }
console.log(JSON.stringify(targetRow))的输出为:
{ "Param1":"123ABC", "Param2":"1995-01-01T20:00:00.000Z", "Param3":1, "Param4":"PARAM", "Param5":"PARAM", "Param6":"", "Param7":"+010000-01-01T01:00:00.000Z", "Param8":"" }
用于绑定数据的模型定义如下:
public class UserWarningMsg { public string? Param1 { get; set; } [DataType(DataType.Date)] public DateTime Param2 { get; set; } public int Param3 { get; set; } public string? Param4 { get; set; } public string? Param5 { get; set; } public string? Param6 { get; set; } public DateTime Param7 { get; set; } public string? Param8 { get; set; } }
我尝试了多种方法但均未解决:
- 移除Ajax请求中的contentType和dataType属性(单独或同时)
- 为控制器方法添加[HttpPost]注解
- 移除参数的[FromBody]注解
- 不调用JSON.stringify()直接发送对象
- 替换data参数为JSON.stringify(targetRow)或targetRow
- 逐个字段构建msgObject后发送
这些方法要么仍导致控制器接收的对象为null,要么引发错误。同一应用中其他地方用相同方法可正常工作,请问为何模型绑定失败,msg始终为null?
问题原因及解决方法
核心问题分析
- Ajax数据结构不匹配:当前Ajax的
data参数是{ 'msg': JSON.stringify(targetRow) },会把JSON字符串嵌套在msg键下发送,但[FromBody]注解期望直接接收与UserWarningMsg结构完全匹配的JSON对象,而非嵌套结构,这是导致绑定失败的主要原因。 - 无效日期格式:
Param7的日期值"+010000-01-01T01:00:00.000Z"不符合.NET可自动解析的标准ISO 8601格式,无法转换为DateTime类型,会直接导致整个模型绑定失败,返回null。
具体解决步骤
修正Ajax数据传递方式
直接传递序列化后的JSON字符串,不要包裹在msg对象中,同时修正contentType的格式(去掉多余分号):$.ajax({ type: 'POST', url: '@Url.Action("EditMessageEffectiveDate", "UserWarningMessages")', contentType: "application/json", dataType: "json", data: JSON.stringify(targetRow), success: function (data) { ... } });修复日期格式或修改模型字段
- 检查Kendo Grid的
Param7字段数据来源,修正为标准日期格式(如"0001-01-01T00:00:00.000Z"或有效业务日期)。 - 如果该字段允许空值,将模型中的
Param7改为可空类型,避免单个字段绑定失败导致整个对象为null:public DateTime? Param7 { get; set; }
- 检查Kendo Grid的
确认控制器方法注解
确保控制器方法标记[HttpPost],避免请求方法不匹配:[HttpPost] public async Task<ActionResult> EditMessageEffectiveDate([FromBody] Models.ViewModels.UserWarningMsg msg){ ... }
内容的提问来源于stack exchange,提问作者John Harrington
相关产品推荐
相关产品推荐

