ASP.NET Core Web API中FromForm绑定List<ReservationQuota>失败问题
ASP.NET Core [FromForm]绑定List失败的解决思路
- 修正表单提交格式:ASP.NET Core的
[FromForm]默认不识别JSON格式的集合,它需要的是表单数组格式,比如ReservationQuota[0].category=General&ReservationQuota[0].reservation=50。你现在传的是JSON字符串,绑定器没法自动解析成List。 - 手动解析JSON数据:既然Request.Form里已经拿到了正确的JSON,直接在控制器里反序列化就行:
[HttpPost] public IActionResult CreateExam([FromForm] ExamCreateDTO dto) { if (Request.Form.TryGetValue("ReservationQuota", out var reservationJson)) { dto.ReservationQuota = JsonSerializer.Deserialize<List<ReservationQuota>>(reservationJson); } // 后续业务逻辑 } - 用[FromJson]特性自动绑定:给DTO里的
ReservationQuota属性加[FromJson]特性,让绑定器自动解析JSON格式的表单字段。记得先引入Microsoft.AspNetCore.Mvc.NewtonsoftJson包,然后在Program.cs里配置:
DTO修改如下:builder.Services.AddControllers().AddNewtonsoftJson();public class ExamCreateDTO : NamedObjectDTO { public string Scope { get; set; } public string Mode { get; set; } [FromJson] public List<ReservationQuota>? ReservationQuota { get; set; } public IEnumerable<IFormFile>? SampleFormFiles { get; set; } } - 检查DTO和嵌套类的访问权限:确保
ReservationQuota类的category、reservation属性都是public且有getter和setter,ExamCreateDTO里的ReservationQuota属性也是public可读写的,继承的NamedObjectDTO没有影响绑定的特殊配置。 - 调整Swagger配置:如果想让Swagger生成正确的表单输入项,可以安装
Swashbuckle.AspNetCore.Annotations包,给属性加注解,帮助Swagger识别集合类型的表单字段,避免提交JSON格式的数据。
内容的提问来源于stack exchange,提问作者manjuv
相关产品推荐
相关产品推荐

