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

.NET 6 Ajax模型绑定JSON传递失败及多参数传递问题咨询

JSON参数传递与.NET Core API绑定问题解答

一、为什么发送{"val":"123"}会报错?

你的Action参数是[FromBody] string val,ASP.NET Core的绑定规则是:当请求头Content-Type为application/json时,会尝试将整个请求体的JSON内容直接反序列化为参数指定的类型。

  • 发送"123"时,这是一个合法的JSON字符串,能直接匹配string类型参数,所以绑定成功。
  • 发送{"val":"123"}时,这是一个JSON对象,而非字符串,序列化器无法将JSON对象转换为string类型,因此抛出The JSON value could not be converted to System.String错误。

二、多参数的JSON格式传递方案

方案1:使用DTO(数据传输对象)类(推荐)

这是ASP.NET Core官方推荐的方式,通过定义包含所有参数的类来接收JSON对象,类型安全且易维护:

// 定义DTO类,属性名与JSON字段名对应(大小写不敏感,可通过配置调整)
public class RequestParams
{
    public string Val1 { get; set; }
    public string Val2 { get; set; }
    public string Val3 { get; set; }
}

// 修改Action接收DTO对象
[HttpPost]
public IActionResult Post([FromBody] RequestParams requestParams)
{
    // 直接使用requestParams.Val1、requestParams.Val2、requestParams.Val3
    return Ok(new { 
        Result = "参数接收成功",
        Val1 = requestParams.Val1,
        Val2 = requestParams.Val2,
        Val3 = requestParams.Val3
    });
}

此时发送{"val1": "a", "val2": "b", "val3": "c"}即可正确绑定所有参数。

方案2:动态接收(无DTO场景)

如果不想定义DTO类,可通过dynamic或JObject动态解析JSON对象,但这种方式缺乏类型校验,仅适合临时场景:

方式一:使用dynamic

[HttpPost]
public IActionResult Post([FromBody] dynamic request)
{
    string val1 = request.val1;
    string val2 = request.val2;
    string val3 = request.val3;
    return Ok(new { val1, val2, val3 });
}

方式二:使用JObject(需引入Newtonsoft.Json包)

using Newtonsoft.Json.Linq;

[HttpPost]
public IActionResult Post([FromBody] JObject request)
{
    string val1 = request["val1"].ToString();
    string val2 = request["val2"].ToString();
    string val3 = request["val3"].ToString();
    return Ok(new { val1, val2, val3 });
}

注意:.NET Core 3及之后版本默认使用System.Text.Json,不再支持直接将JSON对象拆分为多个独立的Action参数,因此最规范的方式是使用DTO类。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 02:20:27