使用HttpGet(...)添加约束在ASP.Net Core中不起作用

时间:2019-01-20 19:02:59

标签: c# asp.net-web-api asp.net-core .net-core asp.net-core-routing

我是ASP.NET核心平台的新手。我正在研究示例应用程序,其中从服务中汇集了一些日常数据。我的API签名如下-

shared_ptr

我的要求是将[HttpGet("daily/{state}/{year}/{month}/{day}")] public async Task<IActionResult> Daily([FromRoute] string state, [FromRoute] int year, [FromRoute] int month, [FromRoute] int day) { //... } 参数限制为3个字符和所有大写字母。

所以我做到了-

state

如果在路线上添加这些约束,则会出现找不到页面错误。

如果我不加约束,那就很好用。

已更新-请参见VS2017的以下屏幕截图。我正在传递类似[HttpGet("daily/{state:regex(A-Z):maxlength(3)}/{year}/{month}/{day}")] public async Task<IActionResult> Daily([FromRoute] string state, [FromRoute] int year, [FromRoute] int month, [FromRoute] int day) { //... } 的URL,但ModelState的IsValid仍返回true。为什么?

enter image description here

2 个答案:

答案 0 :(得分:2)

未找到是因为被调用的URL最有可能与正则表达式约束不匹配。

考虑检查您的正则表达式。

简单的例子

^[A-Z]{1,3}$
  

匹配单个字符,范围为​​[A-Z] 1到3次。

这意味着它将从AZZZ

如果长度必须恰好是3个字符,则删除范围

^[A-Z]{3}$

AAA匹配到ZZZ

因此请相应地更新约束。

[HttpGet("daily/{state:regex(^[[A-Z]]Routing in ASP.NET Core: Regular expressions$)}/{year:int}/{month:int}/{day:int}")]
  

请注意,必须对正则表达式标记进行转义。例如,\{}[]字符需要通过加倍以转义路由参数定界符来转义。 >

有关转义正则表达式的参考文献http://php.net/manual/en/bzip2.installation.php

进行所需的匹配

GET {host}/daily/ABC/2019/01/20

答案 1 :(得分:2)

您可以做的更干净的方法是为您的get请求建立模型。

  public class DailyModel
    {
        [Required]
        [RegularExpression("^[A-Z]{3}$", ErrorMessage ="State should be length of 3 and all in Upper Case")]
        public string State { get; set; }
        public int Year { get; set; }
        public int Month { get; set; }
        public int Day { get; set; }
    }

像上面的代码一样,将数据注释应用于字段。并且在控制器上,如果请求无效,则可以发送模型状态无效消息。

  [Route("api/[controller]")]
    public class TestController : Controller
    {

        [HttpGet("daily/{state}/{year}/{month}/{day}")]
        public async Task<IActionResult> Daily([FromRoute] DailyModel model)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

          ...
        }
    }