我有一个.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()
{
}
但是查询字符串参数有相似之处吗?
谢谢
答案 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:maxlength(15)}”。