2013-02-16 77 views
2

我需要有一個自定義操作我的API控制器類似API/{控制器}/{行動}/{ID}API控制器

這是我的配置

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

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

這個命中默認路由/ api/dropzone/1 但我嘗試通過「ApiByAction」配置來打擊/ api/dropzone/browse/1,但它不起作用。

回答

6

的路線定義的順序很重要,一定要尊重它,因爲他們是在你宣佈他們同樣的順序進行評估:

config.Routes.MapHttpRoute(
    name: "ApiByAction", 
    routeTemplate: "api/{controller}/{action}/{id}", 
    defaults: new { id = RouteParameter.Optional }, 
    constraints: new { action = @"^(?!\d)[a-z0-9]+$" } 
); 

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

還要注意,你可能需要指定一個約束對於第一個路由定義中的{action}令牌。

+0

對不起,這打破了默認路線。/api/{action}/{id}不起作用。 – 2013-02-16 20:11:39

+0

你說得對。您必須在第一個路由定義中爲「{action}」標記指定一個約束。我已經更新了我的答案以說明這一點。這裏的動作名稱不能以數字開頭,只能包含字母或數字,並且至少有一個字符長度。 – 2013-02-16 22:56:12