2012-03-30 23 views
7

讓說我有在MVC 4的Web API控制器兩種方法:URL參數

public IQueryable<A> Get() {} 

而且

public A Get(int id) {} 

與以下路線:

routes.MapHttpRoute(
    name: "Default", 
    routeTemplate: "{controller}/{id}", 
    defaults: new { id = RouteParameter.Optional } 
); 

這按預期工作。添加一個參數,如:

public IQueryable<A> Get(int p) {} 

public A Get(int id, int p) {} 

導致當MVC以下請求返回404的情況:

GET /controller?p=100 

或者

GET /controller/1?p=100 

與消息「沒有行動被發現在與請求匹配的控制器'控制器'上'

我期望URL參數應該通過MVC連接沒有問題,但這不是事實。這是一個錯誤還是我對MVC地圖請求行動的誤解?

+0

[這裏](HTTP不工作://論壇。 asp.net/t/1774984.aspx/2/10)描述了相同的問題,但沒有結論是這種行爲預期爲 – 2012-03-30 13:22:03

+0

PS。由於相同的問題,如果存在多個映射到HTTP動詞的方法,則URL中的OData語法將不起作用。 – 2012-03-30 13:26:36

+0

你可以在你的控制器上顯示你的實際路線和所有方法和簽名嗎? – 2012-03-30 13:51:34

回答

8

如果你想到你正在嘗試做什麼以及你嘗試的路線,你會發現你的情況中的第二個參數「p」也需要被標記爲一個可選參數。

這是你的路線應該像這樣定義:

routes.MapHttpRoute(
name: "Default", 
routeTemplate: "{controller}/{id}/{p}", 
defaults: new { id = RouteParameter.Optional, p = RouteParameter.Optional }); 

一旦你做到這一點,URL

/控制器P = 100 都將映射到

public IQueryable<A> Get(int p) {} 

?方法和URL如下:

/controller/1?p=100 

都將映射到

public A Get(int id, int p) {} 

方法,如您所願。

所以要回答你的問題....不,這不是一個錯誤,但作爲設計/預期。

+0

這是好的,但據我記得前一段時間使用MVC 2時,常用的方法是隻指定方法參數,而不觸及路線。例如:[這裏](http://stackoverflow.com/questions/627838/asp-net-mvc-getting-querystring-values) - 和MVC應該執行連線的查詢部分輸入參數的工作。 – 2012-03-30 14:19:06

+0

@pborovik,正如我剛纔所說的,「如果你仔細想想」,你會意識到你需要指定第二個參數也是可選的。你不能說第一個參數是可選的,但第二個參數不是可選的。這只是沒有意義。 – 2012-03-30 14:26:54

+0

@pborovik如果您爲這些方法定義了「重載」,那麼在未提供第二個參數的情況下,API控制器將調度到這些方法。但在你的情況下,你只有兩種方法,所以調度程序不能調度到任何操作方法。 – 2012-03-30 14:28:52

0

在WebApiConfig添加新的默認爲httproute

RouteParameter.Optional爲其他路由我

config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}/{voucher}", 
      defaults: new { id = RouteParameter.Optional ,defaultroute1="",defaultroute2=""} 
     );