.Net Core Action方法的查询字符串参数的验证

时间:2019-09-05 12:33:26

标签: c# validation asp.net-core routing asp.net-core-webapi

我有一个.Net Core 2.2 Web API。我的一种控制器操作方法采用两个查询字符串参数,分别是一年和一个月。

获取:/ api / ItemsForMonth?year = 2019&month = 8

该操作方法如下:

[HttpGet]
public async Task<ActionResult<IEnumerable<Item>>> GetItemsForMonth([FromQuery] int year, [FromQuery] int month)
{
    if (year <= 2000 || month <= 0 || month > 13)
        return BadRequest("Please check the year and month parameters.");
}

所以我正在检查以确保年份大于2000,并且月份在1到12之间。

那是最好的方法吗?我知道参数是否是路由的一部分,而不是查询字符串(也许应该吗?),我可以这样做

获取:/ api / ItemsForMonth / 2019/8

[HttpGet("/{year:int:min(2000)}/{month:int:min(1):max(12)}")]
public async Task<ActionResult<IEnumerable<Item>>> GetItemsForMonth()
{
}

但是查询字符串参数有相似之处吗?

谢谢

2 个答案:

答案 0 :(得分:2)

一种方法是将查询参数绑定到模型中,并使用基于属性的基本model validation

class DateQueryParameters {
  [Required]
  [Range(2000, int.MaxValue)]
  public int Year {get;set;}

  [Required]
  [Range(1, 12)]
  public int Month {get;set;}
}

[HttpGet]
public async Task<IActionResult> GetItemsForMonth([FromQuery] DateQueryParameters dateParameters)
{
    if(!this.ModelState.IsValid){
       return Task.FromResult(this.BadRequest(this.ModelState));
    }
}

如果您的控制器装饰有ApiController attribute,则会自动完成模型验证。

答案 1 :(得分:0)

是的,现在有了。请参阅以下文档页面:https://docs.microsoft.com/en-us/aspnet/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2#route-constraints

这是示例代码:

[HttpGet("/{year:int:min(2000)}/{month:int:min(1):max(12)}/{query:maxlength(15)}")]
public async Task<ActionResult<IEnumerable<Item>>> GetItemsForMonth()
{
}

注意路由参数列表末尾的“/{query:ma​​xlength(15)}”。