ASP.NET Core Web API中使用FromForm时接收对象为null的问题
问题解决:使用[FromForm]时ServiceInfo对象为null的原因及修复方案
核心问题原因
你的代码存在关键冲突:控制器上标注了[Consumes("application/json")],强制要求请求体为JSON格式,但参数又使用[FromForm]特性,要求ASP.NET Core从表单数据中绑定对象。两种规则不匹配,导致对象绑定失败,最终得到null。
分场景修复方案
场景1:React端需要上传文件(对应代码中注释的Images文件逻辑)
如果请求包含文件,必须使用表单数据(multipart/form-data)传输,此时需做以下修改:
- 移除控制器上的
[Consumes("application/json")]特性,因为表单数据和JSON格式不兼容 - 确保React端用
FormData对象构建请求体,且不要手动设置Content-Type(浏览器会自动处理multipart/form-data的边界)
修改后的控制器代码:
[Route("PotService")] [HttpPost] public async Task<IActionResult> Post([FromForm] ServiceInfo serviceInfo) { // 恢复文件处理逻辑(注意要加await,避免异步操作未完成) using (MemoryStream stream = new MemoryStream()) { await serviceInfo.Images.CopyToAsync(stream); // 这里可以添加文件后续处理逻辑 } bool result = _serManager.AddService(serviceInfo); return Ok(result); }
场景2:React端仅发送普通JSON数据(无文件上传)
如果不需要传输文件,直接用JSON格式即可,修改如下:
- 移除参数上的
[FromForm]特性,让ASP.NET Core默认从JSON请求体绑定对象 - 确保React端发送请求时,设置
Content-Type: application/json,并将数据序列化为JSON字符串
修改后的控制器代码:
[Route("PotService")] [HttpPost] [Consumes("application/json")] public IActionResult Post(ServiceInfo serviceInfo) { bool result = _serManager.AddService(serviceInfo); return Ok(result); }
额外注意点
- 若
ServiceInfo类包含IFormFile类型的属性,必须使用场景1的表单数据方案,因为JSON无法直接传输文件 - React端的请求格式必须和控制器配置严格匹配:发送
FormData对应[FromForm],发送JSON对应默认的JSON绑定
内容的提问来源于stack exchange,提问作者Mahmud Hasan
相关产品推荐
相关产品推荐

