【问题标题】:Url.Action with WebApi and Controller routes带有 WebApi 和控制器路由的 Url.Action
【发布时间】:2014-09-12 04:21:41
【问题描述】:

我有 2 个控制器,其中 1 个是 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("Remove", "List")生成url时,我得到的路径是'/list/remove'。我希望选择 WebApi 路由('/api/list/remove'),因为 WebApi 路由是在其他路由之前注册的。

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

【问题讨论】:

  • 你有WebApi控制器和非Webapi控制器在同一个项目吗?
  • 是的。命名空间是 something.Controllers.WebAPI 和 something.Controllers
  • 你尝试使用 @Url.RouteUrl 与路由名称 DefaultApi?
  • 我已经尝试过@Url.Action("Remove", "List", new { httproute = "DefaultApi" }) 并且按预期工作。
  • 无耻地添加此评论作为答案,对我来说效果很好,但我最初查看了这个问题,因为它没有被接受的答案。

标签: asp.net-mvc asp.net-mvc-4 asp.net-web-api asp.net-mvc-routing


【解决方案1】:
@Url.Action("Remove", "List", new { httproute = "DefaultApi" })

【讨论】:

    【解决方案2】:

    对于遇到此问题的任何人都无法按预期工作...如果您的 URL 生成为 /List/Remove?httproute=DefaultApi

    验证您的 api 路由是否已首先加载!秩序至关重要。

    我还在我的网络路由配置中添加了约束以帮助排除 api 路由:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-14
      • 2014-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多