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

如何向API传递List<enum>参数?接收时参数始终为null

解决ASP.NET Web API接收枚举列表参数为null的问题

你遇到的核心问题是Web API默认不会自动绑定Uri中的枚举集合参数,导致status始终为null。下面给你几种实用的解决方案:

方案一:添加[FromUri]特性明确绑定

Web API的模型绑定器需要你明确指定从Uri中获取集合类型的参数,给List<Status>参数加上[FromUri]特性就能解决问题。修改后的代码如下:

[HttpGet]
[Route("BuscarPropostasPorStatus")]
[Authorize]
public IHttpActionResult BuscarPropostasPorStatus([FromUri] List<Status> status, string inicial="1900-01-01", string final="2099-01-01")
{
    try
    {
        var dataInicial = Convert.ToDateTime(inicial);
        var dataFinal = Convert.ToDateTime(final);
        var usuarioId = new Guid(_token.PegarIdUsuario(HttpContext.Current.GetOwinContext()));
        return Ok(_sellIn.BuscarPropostasPorStatus(usuarioId, status, dataInicial, dataFinal));
    }
    catch (Exception e)
    {
        return new BadRequestCustom(e.Message);
    }
}

public enum Status
{
    AguardandoEnvio,
    AguardandoAprovacao,
    Aprovado,
    Rejeitado,
    Devolvido,
    Deletado
}

之后使用你第二种请求格式:?status=0&status=1,参数就能被正确解析绑定了。

方案二:用逗号分隔参数并手动解析

如果更偏好简洁的status=0,1格式,可以把参数改成string类型,然后手动解析成枚举列表:

[HttpGet]
[Route("BuscarPropostasPorStatus")]
[Authorize]
public IHttpActionResult BuscarPropostasPorStatus(string status, string inicial="1900-01-01", string final="2099-01-01")
{
    try
    {
        var statusList = status.Split(',')
                               .Select(s => (Status)Enum.Parse(typeof(Status), s.Trim()))
                               .ToList();
        var dataInicial = Convert.ToDateTime(inicial);
        var dataFinal = Convert.ToDateTime(final);
        var usuarioId = new Guid(_token.PegarIdUsuario(HttpContext.Current.GetOwinContext()));
        return Ok(_sellIn.BuscarPropostasPorStatus(usuarioId, statusList, dataInicial, dataFinal));
    }
    catch (Exception e)
    {
        return new BadRequestCustom(e.Message);
    }
}

这种方式请求时直接用?status=0,1传递参数即可。

方案三:改用POST请求传递JSON数组

如果参数结构比较复杂,推荐改用POST请求,把参数放在请求体中以JSON数组形式传递,这种方式更直观也更不易出错:

首先定义请求模型并修改方法特性:

[HttpPost]
[Route("BuscarPropostasPorStatus")]
[Authorize]
public IHttpActionResult BuscarPropostasPorStatus([FromBody] PropostaStatusRequest request)
{
    try
    {
        var dataInicial = Convert.ToDateTime(request.Inicial);
        var dataFinal = Convert.ToDateTime(request.Final);
        var usuarioId = new Guid(_token.PegarIdUsuario(HttpContext.Current.GetOwinContext()));
        return Ok(_sellIn.BuscarPropostasPorStatus(usuarioId, request.Status, dataInicial, dataFinal));
    }
    catch (Exception e)
    {
        return new BadRequestCustom(e.Message);
    }
}

public class PropostaStatusRequest
{
    public List<Status> Status { get; set; }
    public string Inicial { get; set; } = "1900-01-01";
    public string Final { get; set; } = "2099-01-01";
}

public enum Status
{
    AguardandoEnvio,
    AguardandoAprovacao,
    Aprovado,
    Rejeitado,
    Devolvido,
    Deletado
}

然后在请求体中发送JSON格式数据:

{
    "status": [0, 1],
    "inicial": "1900-01-01",
    "final": "2099-01-01"
}

这样就能完美接收枚举列表参数了。

内容的提问来源于stack exchange,提问作者João Rafael Colombo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:37:58