我刚开始使用ASP.NET Web API 2.1并遇到了限制。使用属性路由,我可以执行以下操作:
[Route("item/{id:int}")]
public IHttpActionResult GetItem(int id)
{
...
}
网址/item/5
将被路由到此操作,但由于/item/abc
中的int
限制,网址{id:int}
将不会。
我尝试更改我的网址,以便id
参数在查询字符串中及其约束,尽管在查询参数中使用的路由约束从未在文档中提及或演示过。
[Route("item?{id:int}")]
public IHttpActionResult GetItem(int id)
{
...
}
如果我现在尝试运行,则Configure
中的Application_Start
方法调用会出错。
protected void Application_Start()
{
GlobalConfiguration.Configure(WebApiConfig.Register);
}
信息如下。
用户代码未处理ArgumentException
路由模板不能以'/'或'〜'字符开头,也不能包含'?'字符。
有两件事让我烦恼。
首先,MSDN上的the section documenting Route Prefixes表明在路由模板的开头放置~
字符是完全可以接受的。我尝试了它,它的工作原理。
其次,如果不是这样,我如何在查询参数上放置路由约束?考虑以下情况,删除路径约束。
[Route("item")]
public IHttpActionResult GetItem(int id)
{
...
}
网址/item/5
将路由到此操作,id
设置为5
- 但网址/item/abc
也设置为id
0
。
是否无法对查询参数设置路由约束?
答案 0 :(得分:9)
根据http://attributerouting.net/#asp-net-web-api (†) ,这是不可能的:
" 小心!由于Web API WebHost框架的集成问题,以下功能无效:...
- 查询字符串参数约束,..."
†) 请注意,此答案是针对以前版本的Web API编写的,其中属性路由是使用单独的AttributeRouting.WebApi
NuGet package完成的。此后,属性路由已incorporated into the Web API core。尽管如此,似乎仍然不支持开箱即用的查询字符串参数约束。