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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 23:43:24