2014-02-05 81 views
4

我剛開始使用ASP.NET Web API 2.1並遇到了限制。使用屬性的路由,我能做到以下幾點:查詢參數路由約束

[Route("item/{id:int}")] 
public IHttpActionResult GetItem(int id) 
{ 
    ... 
} 

的URL /item/5將被路由到這個動作,但URL /item/abc不會,因爲在{id:int}int約束。

儘管在文檔中沒有提到或演示查詢參數,但我試圖更改我的URL,以便id參數與查詢字符串一起位於查詢字符串中。

[Route("item?{id:int}")] 
public IHttpActionResult GetItem(int id) 
{ 
    ... 
} 

如果我現在嘗試跑,我得在Application_StartConfigure方法調用錯誤。

protected void Application_Start() 
{ 
    GlobalConfiguration.Configure(WebApiConfig.Register); 
} 

消息如下。

ArgumentException的是由用戶代碼未處理

路由模板不能以「/」或「〜」字符開頭,且不能包含一個「?」字符。

有兩件事情打擾了我這件事。

首先,MSDN上的the section documenting Route Prefixes表明將~字符放在路由模板的開頭是完全可以接受的。我嘗試過了,它按照記錄工作。

其次,如果不是這樣,我怎樣才能在查詢參數上放置一個路由約束?考慮以下內容,並刪除了路由約束。

[Route("item")] 
public IHttpActionResult GetItem(int id) 
{ 
    ... 
} 

的URL /item/5將被路由到這個行動,id設置爲5 - 但這樣會將該網址/item/abc,與id設置爲0

有沒有辦法在查詢參數上放置路由約束?

+0

我還沒試過,但正則表達式。我使用這篇文章:http://feedproxy.google.com/~r/TypeCastException/~3/0OVZG5c2bY0/#Regular-Expressions-in-Route-Constraints,它看起來像它允許約束。 – celerno

+1

@celerno謝謝,但這是爲MVC,而不是Web API。 –

回答

8

根據http://attributerouting.net/#asp-net-web-api(匕首),這是不可能的:

當心!由於與Web API虛擬主機提供商架構的整合問題,以下功能將無法正常工作:...

  • 查詢字符串參數的約束,...」

&匕首;)請注意,這個答案是爲先前版本的Web API編寫的,其中屬性路由使用單獨的AttributeRouting.WebApi NuGet package完成。。儘管如此,對於查詢字符串參數的約束似乎仍然不支持。

+3

令人失望,但它回答了我的問題。 –

+0

是的,對於不幫助的答案感到抱歉,這將是一種很好的定義方式。 –

+0

是的,猜測微軟接管了這個項目,並不想要單獨的域名。我想你今天可以在這裏找到關於屬性路由的大部分內容:http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2 –