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

.NET Core 7 Web API与MVC:MVC传入的List<IFormFile>未被API接收

解决MVC向Web API传递List为空的问题

以下是针对该问题的具体排查和解决步骤:

1. 确保MVC端使用正确的请求格式

上传文件必须采用multipart/form-data格式,不能使用JSON请求体。在MVC项目中通过HttpClient发送请求时,需构建MultipartFormDataContent分别添加模型字段和文件:

var multipartContent = new MultipartFormDataContent();

// 逐个添加模型属性(字段名需与API模型属性完全匹配)
multipartContent.Add(new StringContent(model.Title), "Title");
multipartContent.Add(new StringContent(model.Description), "Description");

// 添加文件列表,注意第二个参数的name要和API模型中List<IFormFile>的属性名一致
foreach (var file in fileDetails)
{
    var fileStreamContent = new StreamContent(file.OpenReadStream());
    fileStreamContent.Headers.ContentType = MediaTypeHeaderValue.Parse(file.ContentType);
    multipartContent.Add(fileStreamContent, "fileDetails", file.FileName);
}

// 发送POST请求到API
var response = await httpClient.PostAsync("api/your-upload-endpoint", multipartContent);

2. API端启用表单绑定

API的Action必须通过[FromForm]标记参数,明确告知框架从表单数据中绑定模型(包括文件):

[HttpPost("your-upload-endpoint")]
public async Task<IActionResult> UploadFiles([FromForm] YourBusinessModel model)
{
    if (model.fileDetails == null || !model.fileDetails.Any())
    {
        return BadRequest("未接收到文件");
    }
    // 后续保存逻辑
    return Ok();
}

确保YourBusinessModel中文件列表的属性名与MVC端添加时的name完全一致:

public class YourBusinessModel
{
    public string Title { get; set; }
    public string Description { get; set; }
    public List<IFormFile> fileDetails { get; set; }
}

3. 适配嵌套模型的字段命名

如果模型是嵌套结构(比如父模型包含子对象,子对象中定义文件列表),MVC端添加字段时需要使用.分隔的命名方式:

// 示例:父模型ParentModel包含ChildModel,ChildModel中有List<IFormFile> Files属性
multipartContent.Add(fileStreamContent, "Child.Files", file.FileName);

4. 调整API的上传大小限制

若上传文件总大小超过默认限制,会导致文件被截断,进而出现列表为空的情况。可通过以下方式配置:

方式1:修改appsettings.json

{
  "Kestrel": {
    "Limits": {
      "MaxRequestBodySize": 52428800 // 50MB,可按需调整
    }
  }
}

方式2:在Program.cs中配置FormOptions

builder.Services.Configure<FormOptions>(options =>
{
    options.MultipartBodyLengthLimit = 52428800; // 50MB
    options.ValueLengthLimit = int.MaxValue;
});

5. 调试验证请求内容

  • 在MVC端发送请求前,可通过multipartContent.ReadAsStringAsync()查看构造的请求内容,确认文件字段是否正确添加。
  • 在API端Action中直接读取Request.Form.Files,验证请求中是否包含文件数据,以此区分是请求构造问题还是模型绑定问题。

内容的提问来源于stack exchange,提问作者Maciej Mróz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 15:35:32