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

使用[FromForm]时控制器无法读取List<Answer>数据的问题

ASP.NET Core [FromForm]绑定列表失败排查方案

问题核心

使用[FromForm]绑定List<Answer>这类复杂列表时,form-data是键值对结构,无法直接识别JSON格式的数组,必须遵循索引式命名规则才能完成绑定。Swagger默认生成的JSON格式请求体不符合form-data的绑定要求,这是导致answers列表始终为空的主要原因。

解决步骤

1. 修正表单数据的命名格式

提交form-data时,必须通过索引明确指定数组元素的属性,格式示例如下:

answers[0].id=question1
answers[0].selectedOption=optionA
answers[0].type=radio
answers[1].id=question2
answers[1].selectedOption=optionB
answers[1].type=checkbox

以此类推,每个数组元素的属性都要通过[索引]标识所属的列表项。

2. 初始化模型中的列表

在SaveSurveyAnswersModel的构造函数中初始化列表,避免空引用异常,同时确保绑定框架能正确填充数据:

public class SaveSurveyAnswersModel
{
    public SaveSurveyAnswersModel()
    {
        answers = new List<Answer>();
        Image = new List<IFormFile>();
    }

    public string? FeedbackMessage { get; set; }
    public List<Answer> answers { get; set; }
    public List<IFormFile> Image { get; set; }

    public string user_id { get; set; }
    public string device_id { get; set; }
}

3. 确保属性名称匹配

ASP.NET Core的[FromForm]绑定默认按名称匹配(大小写不敏感,建议保持名称一致)。如果表单提交的键名与模型属性名存在差异,可通过[BindProperty(Name="xxx")]显式指定绑定名称:

public class Answer
{
    [BindProperty(Name = "id")]
    public string id { get; set; }
    [BindProperty(Name = "selectedOption")]
    public string selectedOption { get; set; }
    [BindProperty(Name = "type")]
    public string type { get; set; }
}

4. 测试正确的请求格式

以Postman为例,form-data的键值对应设置为:

  • user_id: 你的用户ID
  • device_id: 你的设备ID
  • FeedbackMessage: 反馈内容
  • answers[0].id: 问题ID1
  • answers[0].selectedOption: 选中的选项1
  • answers[0].type: 问题类型1
  • answers[1].id: 问题ID2
  • answers[1].selectedOption: 选中的选项2
  • answers[1].type: 问题类型2
  • Image: 上传的图片文件(支持多选)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 01:20:58