2013-02-16 73 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