.NET Core HttpDelete接口参数绑定失败:无法转换为IEnumerable<DqcDto>
问题:.NET Core HttpDelete控制器接收FromBody集合时的绑定错误
控制器代码
[HttpDelete("dqc")] [AllowAnonymous] public async Task<IActionResult> DeleteDQCAsync([FromBody] IEnumerable<DqcDto> dqcs, CancellationToken cancellationToken) { try { var response = await _managerService.DeleteDqcAsync(dqcs, cancellationToken); if (response) { return Ok($"DQC codes have been deleted successfully"); } else { return BadRequest("Delete selected DQC codes failed."); } } catch (Exception) { throw; } }
DqcDto类定义
public class DqcDto { public string? DqcCode { get; set; } public string? DqcDescription { get; set; } public string? Project { get; set; } public string? ProjectGroup { get; set; } public string? Task { get; set; } public bool? IsCheck { get; set; } }
Postman请求Payload
{ "dqcs": [ { "DqcCode":"DQC-005-B-1", "DqcDescription":"Is the naming", "Project":"D1", "ProjectGroup":"D", "Task":"T1", "IsCheck":true }, { "DqcCode":"DQC-109-1-1", "DqcDescription":"Checked-In", "Project":"D2", "ProjectGroup":"D", "Task":"T2", "IsCheck":true } ] }
收到的错误信息
"errors": { "$": [ "The JSON value could not be converted to System.Collections.Generic.IEnumerable`1[IQC_Database_Management_API.Dtos.DqcDto]. Path: $ | LineNumber: 0 | BytePositionInLine: 1." ], "dqcs": [ "The dqcs field is required." ] }
问题原因与解决方法
原因
控制器方法的参数是IEnumerable<DqcDto>,但请求的JSON是一个包含dqcs数组的外层对象,模型绑定器无法将这个对象直接转换为集合类型,导致类型转换失败;同时绑定器找不到与参数dqcs直接匹配的JSON内容,因此提示字段必填。
解决方法
有两种可行方案:
方案1:修改请求Payload为直接数组格式
去掉外层的dqcs键,直接传递数组:
[ { "DqcCode":"DQC-005-B-1", "DqcDescription":"Is the naming", "Project":"D1", "ProjectGroup":"D", "Task":"T1", "IsCheck":true }, { "DqcCode":"DQC-109-1-1", "DqcDescription":"Checked-In", "Project":"D2", "ProjectGroup":"D", "Task":"T2", "IsCheck":true } ]
方案2:创建包装类适配现有Payload
定义一个包含集合属性的包装类:
public class DqcDeleteRequest { public IEnumerable<DqcDto> Dqcs { get; set; } }
修改控制器方法的参数为这个包装类:
[HttpDelete("dqc")] [AllowAnonymous] public async Task<IActionResult> DeleteDQCAsync([FromBody] DqcDeleteRequest request, CancellationToken cancellationToken) { try { var response = await _managerService.DeleteDqcAsync(request.Dqcs, cancellationToken); if (response) { return Ok($"DQC codes have been deleted successfully"); } else { return BadRequest("Delete selected DQC codes failed."); } } catch (Exception) { throw; } }
修改后原请求Payload可以正常使用。
内容的提问来源于stack exchange,提问作者AoLiGei
相关产品推荐
相关产品推荐

