2016-05-17 168 views
0

我在玩Web API和MVC路由。我注意到一些我認爲很奇怪的事情。當您使用路由屬性時,框架的寬容度會降低。您會注意到,第一部分中的Get方法在id爲路徑並且它必須是查詢字符串的一部分時失敗。然而,在第二部分中,它會將這個ID作爲任意一個。我會認爲第一部分的代碼會像第二部分的代碼一樣。這是我的理解,MVC框架將嘗試和路由流量,如果需要,從查詢字符串中提取值,這是第二部分代碼的功能。顯然,當你使用路由屬性時,它不會這麼做。有人可以解釋嗎?Web API路由和查詢字符串

---------------------第一部分(代碼與路由屬性)

WebApiConfig.cs

config.Routes.MapHttpRoute("DefualtRouting", 
           "api/{controller}/{id}", 
           new { id = RouteParameter.Optional }); 

TestController.cs

[Route("api/test/")] //(notice routing attribute) 
public IHttpActionResult Get(string id) 
{ 
    return Ok(); 
} 

這裏是我所得到的,當我針對這些網址」小號

  • 本地主機:43321/API /測試/ 1 - 這會返回一個404
  • 本地主機:43321/API /測試ID = 1 - 這個工程

----- ----------------第二部分(代碼而不路由屬性) WebApiConfig.cs

config.Routes.MapHttpRoute("DefualtRouting", 
           "api/{controller}/{id}", 
           new { id = RouteParameter.Optional }); 

TestController.cs

public IHttpActionResult Get(string id) 
{ 
    return Ok(); 
} 

這裏是我所得到的,當我針對這些網址的

  • 本地主機:43321/API /測試/ 1 - 這個工程
  • 本地主機:43321/API /測試?id = 1 - This works

回答

0

也許我很困惑。但是,你的屬性應該是這樣的:

[Route("api/test/{id}")] //(notice routing attribute) 
public IHttpActionResult Get(string id) 
{ 
    return Ok(); 
} 

它也像你使用屬性路由和配置在WebApiConfig.cs路線。或者那只是你的後備?

我只使用其中一個。

如果你想使ID可選的,我覺得你可以這樣做:

[Route("api/test/{id:string?}")] //(notice routing attribute) 
public IHttpActionResult Get(string id) 
{ 
    return Ok(); 
} 

僅供參考,請參閱: http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2#optional

+0

的Web API和MVC是相當新的給我。我正在瀏覽一個使用路由屬性和配置路由的複合教程,他爲什麼這麼做,我不知道。我試圖在這裏回答的一個問題是,爲什麼帶有route屬性的控制器在沒有route屬性的控制器時沒有從查詢字符串中選擇ID。 –

+0

因爲沒有路由屬性的人將Id定義爲可選。我的例子展示瞭如何用屬性來做到這一點。 –