.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
相关产品推荐
相关产品推荐

