查询参数路由约束

Tim*_*lds 4 c# asp.net asp.net-web-api-routing asp.net-web-api2

我刚开始使用ASP.NET Web API 2.1并遇到了限制.使用属性路由,我可以执行以下操作:

[Route("item/{id:int}")]
public IHttpActionResult GetItem(int id)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

URL /item/5将被路由到此操作,但/item/abc由于int约束,URL 不会{id:int}.

我尝试更改我的URL,以便id参数在查询字符串及其约束中,尽管在查询参数上使用的路由约束从未在文档中提及或演示过.

[Route("item?{id:int}")]
public IHttpActionResult GetItem(int id)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

如果我现在尝试运行,我会在Configure方法调用中出错Application_Start.

protected void Application_Start()
{
    GlobalConfiguration.Configure(WebApiConfig.Register);
}
Run Code Online (Sandbox Code Playgroud)

消息如下.

用户代码未处理ArgumentException

路径模板不能以'/'或'〜'字符开头,也不能包含'?' 字符.

有两件事让我烦恼不已.

首先,在MSDN上记录路由前缀的部分清楚地表明~,在路径模板的开头放置一个字符是完全可以接受的.我试过了,它的工作原理记录在案.

其次,如果不是这样,我如何在查询参数上放置路由约束?考虑以下情况,删除路径约束.

[Route("item")]
public IHttpActionResult GetItem(int id)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

该URL /item/5将被路由到这个行动,id设置为5-但这样会将该网址/item/abc,与id设置为0.

是否无法对查询参数设置路由约束?

Mic*_*rum 9

根据http://attributerouting.net/#asp-net-web-api(† ),这是不可能的:

" 注意!由于Web API WebHost框架的集成问题,以下功能不起作用:...

  • 查询字符串参数约束,..."

†)请注意,此答案是针对以前版本的Web API编写的,其中属性路由使用单独的AttributeRouting.WebApi NuGet包完成.此后,属性路由已合并到Web API核心中.然而,似乎仍然不支持开箱即用的查询字符串参数约束.

  • 令人失望,但它回答了我的问题. (3认同)