我是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。为什么?
答案 0 :(得分:2)
未找到是因为被调用的URL最有可能与正则表达式约束不匹配。
考虑检查您的正则表达式。
简单的例子
^[A-Z]{1,3}$
匹配单个字符,范围为[A-Z] 1到3次。
这意味着它将从A
到ZZZ
如果长度必须恰好是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);
}
...
}
}