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结构,无需改动前端代码:
- 定义与前端字段对应的请求模型类
public class OrderSubmitDto { // 字段名与前端JSON的key匹配即可,大小写不敏感也可正常绑定 public int FoodID { get; set; } public int BasketID { get; set; } }
- 修改后端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
相关产品推荐
相关产品推荐

