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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 10:05:15