.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)}”。
我有一个 .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)}”。