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

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?


问题原因及解决方法

核心问题分析

  1. Ajax数据结构不匹配:当前Ajax的data参数是{ 'msg': JSON.stringify(targetRow) },会把JSON字符串嵌套在msg键下发送,但[FromBody]注解期望直接接收与UserWarningMsg结构完全匹配的JSON对象,而非嵌套结构,这是导致绑定失败的主要原因。
  2. 无效日期格式:Param7的日期值"+010000-01-01T01:00:00.000Z"不符合.NET可自动解析的标准ISO 8601格式,无法转换为DateTime类型,会直接导致整个模型绑定失败,返回null。

具体解决步骤

  1. 修正Ajax数据传递方式
    直接传递序列化后的JSON字符串,不要包裹在msg对象中,同时修正contentType的格式(去掉多余分号):

    $.ajax({
        type: 'POST',
        url: '@Url.Action("EditMessageEffectiveDate", "UserWarningMessages")',
        contentType: "application/json",
        dataType: "json",
        data: JSON.stringify(targetRow),
        success: function (data) { ... }
    });
    
  2. 修复日期格式或修改模型字段

    • 检查Kendo Grid的Param7字段数据来源,修正为标准日期格式(如"0001-01-01T00:00:00.000Z"或有效业务日期)。
    • 如果该字段允许空值,将模型中的Param7改为可空类型,避免单个字段绑定失败导致整个对象为null:
      public DateTime? Param7 { get; set; }
      
  3. 确认控制器方法注解
    确保控制器方法标记[HttpPost],避免请求方法不匹配:

    [HttpPost]
    public async Task<ActionResult> EditMessageEffectiveDate([FromBody] Models.ViewModels.UserWarningMsg msg){ ... }
    

内容的提问来源于stack exchange,提问作者John Harrington

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 00:13:13