无法通过jQuery AJAX向C# MVC传递对象,控制器接收值为空求助
解决jQuery AJAX传递对象到C# MVC控制器属性为空的问题
我来帮你搞定这个困扰!你遇到的核心问题是AJAX请求的数据格式和声明的Content-Type不匹配,再加上控制器参数缺少必要的绑定特性,导致MVC无法正确解析你的Order对象。
问题根源分析
- 你设置了
contentType: "application/json",这意味着服务器期望接收JSON格式的字符串,但你直接传递了JavaScript对象order——jQuery会默认把对象编码成表单格式(application/x-www-form-urlencoded),和你声明的Content-Type冲突,服务器自然无法解析成Order对象。 - ASP.NET MVC需要明确告知从请求体中读取数据,否则会默认从URL参数或表单数据中绑定,这就需要用到
[FromBody]特性。
修正方案
1. 修改JavaScript代码:将对象转为JSON字符串
在AJAX的data参数中,用JSON.stringify()把Order对象转换成JSON字符串,确保发送的数据格式和Content-Type一致:
function Order() { this.Partner; this.OrderID; this.TypeOfOrder; this.SubmittedBy; this.CompanyID; this.CompanyName; } jQuery('button[type="submit"]').click(function (event) { event.preventDefault(); var order = new Order(); order.Partner = "ABC"; // 修正语法:把逗号改为分号 order.OrderID = "123"; order.TypeOfOrder = "Website"; console.log(order); jQuery.ajax({ url: "/my-route", type: "POST", dataType: 'json', contentType: "application/json", data: JSON.stringify(order), // 关键:转换为JSON字符串 success: function (data) { console.log(data); }, failure: function (response) { console.log("ERROR!"); } }); })
2. 修改C#控制器:添加[FromBody]特性
给控制器的Order参数加上[FromBody],告诉框架从请求体中读取JSON数据并绑定到对象上:
// POST my-route [HttpPost] public Order Post([FromBody] Order order) // 添加[FromBody]特性 { return order; }
你的C# Model部分是正确的,不需要修改。
验证效果
修改完成后,再次点击提交按钮,控制台应该会返回带有正确属性值的Order对象,控制器接收的参数也不会再是空值啦!
内容的提问来源于stack exchange,提问作者friday-json
相关产品推荐
相关产品推荐

