ASP.NET Core 3.1中Ajax绑定原始类型参数失败的解决方案咨询
解决方案:ASP.NET Core 3.1中Axios POST请求参数绑定失败问题
这个问题我之前在项目里也踩过坑,核心原因是ASP.NET Core的[FromBody]属性对简单类型(如string、int)和复杂对象的绑定逻辑不一样:
当你用Axios发送{ abc: 123 }时,请求体是一个JSON对象,但[FromBody]string abc期望的是纯字符串格式的请求体(比如直接发送"123"),而不是嵌套在对象中的值,所以导致绑定失效。
下面给你三种可行的解决方案,按推荐程度排序:
方案1:使用DTO类接收请求参数(推荐)
这是最规范、扩展性最好的方式,尤其适合后续可能增加参数的场景。
首先创建一个用于接收请求的DTO类:
public class TestRequestDto { public string Abc { get; set; } }
然后修改Controller的Action方法,用这个DTO类接收参数:
[HttpPost] public IActionResult Test([FromBody]TestRequestDto request) { return Json(new { request.Abc }); }
你的Axios请求代码不需要任何修改,ASP.NET Core会自动将JSON对象解析到DTO的对应属性上。
方案2:修改Axios请求,发送纯字符串请求体
如果你不想创建额外的DTO类,可以调整Axios的请求体,直接发送纯字符串而非对象:
axios({ url: '/home/test', method: 'post', data: "123", // 直接传入字符串值,而非对象 headers: { 'Content-Type': 'application/json' // 保持JSON类型头,框架能正确解析纯字符串 } }) .then(function (response) { console.log(response); }) .catch(function (error) { console.log(error); });
此时你的Action方法可以保持[FromBody]string abc的写法,参数能正常绑定。
方案3:用JObject/JsonElement直接解析JSON对象
如果只是临时场景,也可以直接用JSON对象类型接收,手动提取参数:
方式A:使用Newtonsoft.Json的JObject
(ASP.NET Core 3.1默认可能需要安装Newtonsoft.Json NuGet包)
using Newtonsoft.Json.Linq; [HttpPost] public IActionResult Test([FromBody]JObject request) { string abc = request["abc"]?.ToString(); return Json(new { abc }); }
方式B:使用System.Text.Json的JsonElement
(ASP.NET Core 3.1默认内置System.Text.Json)
using System.Text.Json; [HttpPost] public IActionResult Test([FromBody]JsonElement request) { string abc = request.GetProperty("abc").GetString(); return Json(new { abc }); }
内容的提问来源于stack exchange,提问作者Nick Money
相关产品推荐
相关产品推荐

