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

Validation on query string parameters of .Net Core Action Method

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

获取:/api/ItemsForMonth?年=2019&月=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()
{
}

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

谢谢

一种方法是将查询参数绑定到模型中并使用基于基本属性的 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,模型验证将自动完成。

是的,现在有了。请参阅以下文档页面: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:maxlength(15)}”。