如何向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
相关产品推荐
相关产品推荐

