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

Fab*_*uez 2 c# validation routing asp.net-core 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.");
}
Run Code Online (Sandbox Code Playgroud)

所以我正在检查以确保年份大于 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()
{
}
Run Code Online (Sandbox Code Playgroud)

但是查询字符串参数有类似的东西吗?

谢谢

Jot*_*edo 5

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

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));
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您的控制器装饰有ApiController属性,模型验证将自动完成。