使用[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: 你的用户IDdevice_id: 你的设备IDFeedbackMessage: 反馈内容answers[0].id: 问题ID1answers[0].selectedOption: 选中的选项1answers[0].type: 问题类型1answers[1].id: 问题ID2answers[1].selectedOption: 选中的选项2answers[1].type: 问题类型2Image: 上传的图片文件(支持多选)
内容的提问来源于stack exchange,提问作者Satyam
相关产品推荐
相关产品推荐

