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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 06:53:21