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
相关产品推荐
相关产品推荐

