2013-04-24 88 views
3

我有這兩條路線定義:的Web API路線被忽略

routes.MapRoute(
    name: "GetVoucherTypesForPartner", 
    url: "api/Partner/{partnerId}/VoucherType", 
    defaults: new { controller = "Partner", action = "GetVoucherTypesForPartner"} 
); 

routes.MapRoute(
    name: "Default", 
    url: "api/{controller}/{action}/{id}", 
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional} 
); 

在我PartnerProfile控制器,我有2種方法:

public Partner Get(string id) 
{ } 

public IEnumerable<string> GetVoucherTypesForPartner(string id) 
{ } 

如果我打的網址,然後,如預期~/api/Partner/1234,調用Get方法。
但是,如果我點擊了網址~/api/Partner/1234/VoucherType,那麼調用相同的Get方法。我期待我的GetVoucherTypesForPartner被調用。

我敢肯定,東西在我的路線設置是錯誤的...

回答

2

你似乎已經映射標準的MVC路線,非Web API的路線。有很大的不同。標準路由由派生自Controller類的控制器使用,但如果您使用的是ASP.NET Web API,並且您的控制器來自ApiController類型,則應該定義HTTP路由。

你應該在你的~/App_Start/WebApiConfig.cs中這樣做,而不是在~/App_Start/RouteConfig.cs之內。

因此,繼續前進:

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     config.Routes.MapHttpRoute(
      name: "GetVoucherTypesForPartner", 
      routeTemplate: "api/Partner/{partnerId}/VoucherType", 
      defaults: new { controller = "Partner", action = "GetVoucherTypesForPartner" } 
     ); 

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

然後:

public class PartnerController : ApiController 
{ 
    public Partner Get(string id) 
    { 
     ... 
    } 

    public IEnumerable<string> GetVoucherTypesForPartner(string partnerId) 
    { 
     ... 
    } 
} 

事情需要注意:

  • 我們定義HTTP路線不是標準的MVC路線
  • 的參數GetVoucherTypesForPartner操作必須是ca而不是id爲了尊重你的路由定義,並避免任何混淆
+0

然後,當然,這是不正確的,在ASP.NET核心,其中有一個單一的路由。 – 2017-06-02 18:43:49