jQuery向ASP.NET Core WebAPI提交强类型Model返回415错误的问题求助
问题核心根因
你遇到的415错误和JSON编码本身无关,本质是ASP.NET Core的模型绑定规则触发了媒体类型不匹配:
- 你的
OrderController继承自带视图渲染能力的Controller基类(方法里还有返回View的Index方法),哪怕标注了[ApiController],框架依然会沿用传统MVC的默认绑定逻辑:没有显式标注绑定源的复杂类型参数,默认从表单、路由值、查询字符串取值,不会自动从JSON请求体绑定。 - 当前端用
application/json的Content-Type发送JSON数据时,框架为了给表单绑定找匹配的输入格式化器,发现没有能处理application/json格式的表单类格式化器,就直接抛出415 Unsupported Media Type错误。 - 为什么无参数、dynamic类型参数可以正常进入断点:无参数的场景根本不需要执行模型绑定流程;dynamic类型的绑定逻辑不依赖格式化器的媒体类型匹配检查,会直接读取请求流,所以不会触发415拦截。
可直接落地的解决方法
- 给
AddItem方法的强类型参数显式标注[FromBody]特性,明确告知框架这个参数需要从请求体的JSON内容反序列化绑定,不要走默认的表单绑定逻辑:
[HttpPost] [Route("AddItem")] public IActionResult AddItem([FromBody] AddToCartModel model) { throw new NotImplementedException(); }
- (长期优化建议)如果同一个控制器同时承载页面视图返回和API接口功能,很容易出现绑定逻辑混乱,可以按职责拆分:纯接口逻辑的控制器继承
ControllerBase,视图页面逻辑的控制器继承Controller,能减少很多隐形的绑定规则冲突。 - 配套排查:如果标注
[FromBody]之后不再报415,但出现模型属性都是默认值的400错误,需要检查JSON序列化的匹配规则。.NET Core默认用System.Text.Json做反序列化,可以在服务配置里开启大小写不敏感匹配,适配前端传的camelCase格式属性:
// 在Program.cs里配置 builder.Services.AddControllers() .AddJsonOptions(options => { options.JsonSerializerOptions.PropertyNameCaseInsensitive = true; });
- 额外校验点:可以打开浏览器开发者工具的网络面板,找到
AddItem的请求,核对请求头里的Content-Type字段是否为完整的application/json,避免jQuery意外把请求改成表单格式导致的绑定失败。
内容的提问来源于stack exchange,提问作者Peter Lange
相关产品推荐
相关产品推荐

