You need to enable JavaScript to run this app. ASP.NET中Ajax发POST请求到控制器方法接收值为null的问题解决
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET中Ajax发POST请求到控制器方法接收值为null的问题解决

核心错误原因
  • 前后端参数绑定规则不匹配:前端设置contentType: application/json,向请求体发送包含FoodID、BasketID两个字段的JSON对象,但后端方法定义的是名为s的字符串参数,两者字段名、数据结构完全不对应,模型绑定过程无法匹配到s的对应值,最终参数为null。
  • ASP.NET 默认模型绑定逻辑下,通过application/json格式发送的请求体内容,不会自动绑定到单个简单类型参数,必须通过[FromBody]特性指定绑定来源,且参数结构需要和前端发送的JSON结构匹配。
  • 现有后端Post(string s)的定义本身就无法承载前端发送的两个字段,即使调整绑定特性也无法获取FoodID、BasketID的取值。
正确实现方案

方案1(推荐:适配现有前端逻辑)

直接修改后端的参数定义,匹配前端传输的JSON结构,无需改动前端代码:

  1. 定义与前端字段对应的请求模型类
public class OrderSubmitDto
{
    // 字段名与前端JSON的key匹配即可,大小写不敏感也可正常绑定
    public int FoodID { get; set; }
    public int BasketID { get; set; }
}
  1. 修改后端Post方法,添加绑定特性
[HttpPost]
public bool Post([FromBody] OrderSubmitDto request)
{
    // 此处可正常读取request.FoodID、request.BasketID的取值
    return true;
}

如果项目启用了[ApiController]特性,[FromBody]可省略,框架会自动推断绑定来源;未启用时必须显式添加该特性。

方案2(兼容现有后端Post(string s)定义)

如果保留后端单字符串参数s的设计,需要修改前端发送逻辑,确保参数名与后端匹配:
调整前端Ajax配置,将发送内容改为键名为s的结构,同时移除application/json的ContentType配置,使用默认表单格式发送:

function SendData(foodID, basketID) {
    // 将目标数据序列化后作为s的取值
    var postData = { s: JSON.stringify({ FoodID: foodID, BasketID: basketID }) };

    $.ajax({
        url: '/Order/Post',
        type: 'POST',
        data: postData,
        dataType: 'json' // 修正原有datatype的拼写为jQuery标准的camelCase格式
    }).done(function (data) {
        console.log(data);
    }).fail(function (data) {
        console.log("Error: " + data);
    });
}

该方案下后端拿到的s为序列化后的JSON字符串,需要自行反序列化才能提取FoodID、BasketID的取值,不推荐生产环境使用。

补充说明

当前方法可正常触发但参数为null,是ASP.NET模型绑定的默认行为:当找不到匹配的参数值时,框架不会抛出异常,只会给参数赋默认值(引用类型为null、值类型为对应默认值)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.24 16:24:03