使用jQuery AJAX POST调用C# HttpPost方法遇参数绑定异常
为什么jQuery AJAX POST JSON到C#控制器时,单个string参数无效但对象参数有效?
你前端发送的是JSON格式的请求体:用JSON.stringify(data)把对象转成JSON字符串,同时设置了contentType: "application/json; charset=utf-8",此时HTTP请求的Body是完整的JSON对象:{"ID":"1","name":"TEST"}。
而ASP.NET的参数绑定默认规则是:
- 对于
string这类简单类型参数,框架会优先从URL查询参数或者表单键值对(application/x-www-form-urlencoded格式)里匹配参数,不会主动解析JSON请求体里的单个字段,所以直接用string ID, string name会取不到值。 - 当你用自定义类(object)作为参数时,框架能识别到请求体是JSON格式,自动把整个JSON字符串反序列化成该类的实例,因此可以正常获取ID和name的值。
解决办法
1. 使用自定义模型类(推荐)
创建一个和前端数据结构匹配的类,框架会自动完成JSON反序列化:
public class RequestModel { public string ID { get; set; } public string Name { get; set; } // 属性名要和前端key大小写匹配,或用[JsonProperty]指定映射关系 } [HttpPost] public bool ActionName(RequestModel model) { var id = model.ID; var name = model.Name; // 业务逻辑 return true; }
2. 给简单类型参数添加[FromBody]特性
告诉框架从请求体读取参数,但注意一次只能用一个[FromBody]参数(因为JSON请求体是单一对象,无法拆分到多个参数):
[HttpPost] // 这种写法仅第一个参数能取到值,第二个会为空,不推荐 public bool ActionName([FromBody] string ID, [FromBody] string name) { // 业务逻辑 return true; }
3. 修改前端请求格式,发送表单键值对
如果不想改动后端,可去掉JSON.stringify,不设置contentType(默认是application/x-www-form-urlencoded),让前端发送表单格式数据:
var data = { ID: '1', name: 'TEST' }; $.ajax({ type: "POST", data: data, // 直接传对象,无需JSON.stringify dataType: "json", url: url, // 其他配置 });
此时后端的string ID, string name参数就能正常获取值,框架会从表单数据中解析参数。
内容的提问来源于stack exchange,提问作者Ansel Liou
相关产品推荐
相关产品推荐

