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

Asp.Net Core ApiController传IFormFile与字符串报400错误求助

解决Asp.Net Core ApiController接收FormData时IFormFile与string参数绑定400错误

问题分析

通过FormData同时传递IFormFile文件和string类型参数时出现400错误,且productId始终为null,核心原因是ApiController的参数绑定规则:

  • ApiController默认启用严格的模型验证与参数绑定逻辑,POST请求默认期望JSON格式请求体
  • IFormFile默认支持从multipart/form-data(即FormData)中绑定,但普通string参数默认会从URL查询字符串或JSON请求体中取值,无法自动识别FormData中的表单字段,导致绑定失败触发400错误

解决方案

方案1:给string参数添加[FromForm]特性

明确告知框架从表单数据中读取该参数,修改Controller代码如下:

[HttpPost]
[Route("UploadProductImageForEdit")]
[Produces("application/json")]
public IActionResult UploadProductImageForEdit(IFormFile file, [FromForm] string productId)
{
    // 业务逻辑处理
    return Ok();
}

方案2:使用ViewModel统一接收参数(推荐)

创建专门的模型类封装所有表单参数,便于后续扩展和维护:

// 定义上传模型
public class ProductImageUploadModel
{
    public IFormFile File { get; set; }
    public string ProductId { get; set; }
}

// 修改Controller方法
[HttpPost]
[Route("UploadProductImageForEdit")]
[Produces("application/json")]
public IActionResult UploadProductImageForEdit([FromForm] ProductImageUploadModel model)
{
    // 使用model.File和model.ProductId进行业务处理
    return Ok();
}

前端代码说明

你的JavaScript代码无需修改,FormData的设置是正确的,确保productId.value有有效值即可:

let avatarModel = new FormData();
avatarModel.set("file", blob);
avatarModel.set("productId", productId.value);

var xhr = new XMLHttpRequest();
xhr.responseType = 'json';
xhr.open('POST', '/Api/Admin/UploadProductImageForEdit', true);
xhr.send(avatarModel);

xhr.onreadystatechange = async function () {
    if (this.readyState == 4 && this.status == 200) {
        // 处理成功响应
    }
}

内容的提问来源于stack exchange,提问作者Mahdi Saneipour

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 05:00:06