5

我有2个控制器,其中1是的WebAPI:Url.Action用的WebAPI和控制器路由

public class ListController : ApiController 
{   
    public object Remove(string ListId, List<string> ItemIds) 
    { 
     //removed 
    } 
} 

public class ListController : Controller 
{   
    public object Remove(string ListId, List<string> ItemIds) 
    { 
     //removed 
    } 
} 

我的路线被登记在Global.asax如下:

WebApiConfig.Register(GlobalConfiguration.Configuration); 
RouteConfig.RegisterRoutes(RouteTable.Routes); 

我的WebAPI路线定义为:

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

当生成通过@ Url.Action( “删除”, “列表”)的URL,我得到的路径是 '/列表/删除'。我预计WebApi路由('/ api/list/remove')被选中,因为WebApi路由在其他路由之前被注册。

如何获得@ Url.Action按预期返回WebApi路由?

+0

你有在同一项目作为非的WebAPI控制器的WebAPI控制器? – DavidG

+0

是的。命名空间是东西.Controllers.WebAPI和something.Controllers – Jason

+1

你试图使用'@ Url.RouteUrl'与路由名称DefaultApi? – py3r3str

回答

2
@Url.Action("Remove", "List", new { httproute = "DefaultApi" }) 
+1

适合我! – Jamo

0

对于整个运行任何人这个工作不正常...如果你的URL为/生成列出/删除?httproute = DefaultApi

验证您的API路由被首先装!订单至关重要。

我还添加了约束,以我的网络的路由配置,以帮助排除API路线:

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