C# API PUT请求中FromBody参数始终为null问题排查
问题描述
- 初始需求:向C# API传递一个int类型的
id和JSON字符串数组,触发了字符串格式错误 - 简化测试后:改为传递简单字符串作为
items参数,后端能正常获取id值,但items始终返回null - 排查情况:请求Payload显示格式正常,已确认请求头、负载、响应及调试视图信息(附截图)
前端JQuery代码
$.ajax({ url: '/api/Test/ProcessData', type: 'POST', contentType: 'application/json', data: JSON.stringify({ id: 1001, items: "sample string" // 最初版本为数组:["itemA", "itemB"] }), success: res => console.log(res), error: xhr => console.error(xhr.responseText) });
C# API后端代码
// 简化测试版本 [HttpPost] public IActionResult ProcessData(int id, string items) { // id能拿到值,items始终为null return Ok(new { ReceivedId = id, ReceivedItems = items }); } // 最初数组版本 [HttpPost] public IActionResult ProcessData(int id, List<string> items) { // 触发字符串格式错误 return Ok(new { ReceivedId = id, ReceivedItems = items }); }
请求相关信息
- 请求头:
Content-Type: application/json; charset=utf-8 - 请求Payload:
{"id":1001,"items":"sample string"}(数组版本为{"id":1001,"items":["itemA","itemB"]}) - 响应:
{"ReceivedId":1001,"ReceivedItems":null}
解决方案
核心原因
ASP.NET Core默认不会从请求体中同时绑定多个简单类型参数(int、string等),它仅支持自动绑定一个复杂类型参数,或者从路由/查询字符串绑定简单类型。当你在JSON请求体中同时传id和items时,只有第一个简单类型参数能被绑定,第二个参数因无法匹配绑定规则返回null;数组版本则直接因类型不匹配触发格式错误。
解决方法
1. 定义DTO类(推荐方案)
创建一个包含所有请求参数的类,让API动作接收这个复杂类型参数:
public class DataRequestDto { public int Id { get; set; } public string Items { get; set; } // 数组版本替换为:public List<string> Items { get; set; } } [HttpPost] public IActionResult ProcessData([FromBody] DataRequestDto request) { // request.Id和request.Items均可正常获取值 return Ok(new { ReceivedId = request.Id, ReceivedItems = request.Items }); }
前端代码无需修改,保持原JSON传参格式即可。
2. 拆分参数传递(适用于简单场景)
将id从路由或查询字符串传递,items从请求体传递:
[HttpPost("ProcessData/{id}")] public IActionResult ProcessData(int id, [FromBody] List<string> items) { return Ok(new { ReceivedId = id, ReceivedItems = items }); }
前端调整请求URL和传参内容:
$.ajax({ url: '/api/Test/ProcessData/1001', type: 'POST', contentType: 'application/json', data: JSON.stringify(["itemA", "itemB"]), // ... 其他逻辑不变 });
验证要点
- 确保前端请求的
contentType严格设置为application/json,否则后端无法解析JSON请求体 - 检查JSON格式是否符合语法规范,数组或字符串无语法错误
内容的提问来源于stack exchange,提问作者P S
相关产品推荐
相关产品推荐

