2012-08-03 80 views
4

我有2種操作方法,像這樣的WebAPI控制器:重載的WebAPI控制器2種Get方法

public List<AlertModel> Get() 
{ 
    return _alertService.GetAllForUser(_loginService.GetUserID()); 
} 

public AlertModel Get(int id) 
{ 
    return _alertService.GetByID(id); 
} 

然而,當我主動要求api/alerts我得到以下錯誤:

The parameters dictionary contains a null entry for parameter 'id' of non-nullable type 'System.Int32' for method 'ekmSMS.Common.Models.AlertModel Get(Int32)' in 'ekmSMS.Web.Api.AlertsController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter.

我在global.asax設置了以下路線:

routes.MapHttpRoute("Api", "api/{controller}/{id}", new { id = UrlParameter.Optional }); 

如果th是超載工作的類型?如果它應該我做錯了什麼?

編輯

雖然這個問題是有關的WebAPI,控制器是一個MVC3項目的一部分,這些都是其他MapRoutes

routes.MapRoute("Templates", "templates/{folder}/{name}", new { controller = "templates", action = "index", folder = "", name = "" });  
routes.MapRoute("Default", "{controller}/{action}/{id}", new { controller = "app", action = "index", id = UrlParameter.Optional }); 
+0

我們可以看到所有的MapHttp路由?有時候可能會對他們產生一些干擾。 – 2012-08-03 11:33:53

+0

@ user854301問題是關於Web API,而不是MVC。 – tugberk 2012-08-03 12:26:28

+0

這是非常有趣的cuz路由參數的默認值是UrlParameter.Optional'被刪除,如果它沒有提供,所以動作選擇邏輯應該在這裏拿起Get()操作方法(對於任何請求來* API /警報*)。我會嘗試重現錯誤。 – tugberk 2012-08-03 12:28:00

回答

12

的問題是,你使用UrlParameter.Optional(這是一個ASP.NET MVC特定類型)而不是RouteParameter.Optional。改變你的路線如下,然後它應該工作:

GlobalConfiguration.Configuration.Routes.MapHttpRoute(
    "Api", 
    "api/{controller}/{id}", 
    new { id = RouteParameter.Optional } 
); 
+0

不錯的一個哥們! – jcvandan 2012-08-03 12:55:03

+0

偉大的發現:D - – 2012-08-03 14:10:51