WebAPI控制器中的MVC路由

时间:2015-03-19 14:39:24

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

关于MVC和WebAPI中的路由的快速问题。我添加了路由config.cs的路由:

        routes.MapRoute(
            name: "ConfirmEmail",
            url: "ConfirmEmail/{userid}",
            defaults: new { controller = "Email", action = "ConfirmEmail" }
        );

这是按照正常情况在global.asax中注册的:

RouteConfig.RegisterRoutes(RouteTable.Routes);

我正在尝试生成一个在电子邮件中使用的URL,该电子邮件是作为WebAPI控制器函数中的函数调用的一部分发送的。我正在使用UrlHelper.Link函数尝试生成一个URL,但是我收到一条错误消息,指出无法通过名称找到该路径:

var url = Url.Link("ConfirmEmail", new { userid = "someUserId" });

现在我的印象是路由字典在MVC和WebAPI控制器上下文中共享但是我看不到传入Web API调用的路由字典中的MVC路由(在Request对象上)但是我定义的WebAPI路由在那里。

我错过了什么吗?

3 个答案:

答案 0 :(得分:11)

这是从WebApi生成到MVC路由的链接的更简洁方法。我在自定义基本api控制器中使用此方法。

protected string MvcRoute(string routeName, object routeValues = null)
{
    return new System.Web.Mvc.UrlHelper(System.Web.HttpContext.Current.Request.RequestContext)
       .RouteUrl(routeName, routeValues, System.Web.HttpContext.Current.Request.Url.Scheme);

}

答案 1 :(得分:3)

使用Richards提示找到路线的位置,我将以下功能放在一起:

    // Map an MVC route within ApiController
    private static string _MvcRouteURL(string routeName, object routeValues)
    {
        string mvcRouteUrl = "";

        // Create an HttpContextBase for the current context, used within the routing context
        HttpContextBase httpContext = new System.Web.HttpContextWrapper(HttpContext.Current);

        // Get the route data for the current request
        RouteData routeData = HttpContext.Current.Request.RequestContext.RouteData;

        // Create a new RequestContext object using the route data and context created above
        var reqContext = new System.Web.Routing.RequestContext(httpContext, routeData);

        // Create an Mvc UrlHelper using the new request context and the routes within the routing table
        var helper = new System.Web.Mvc.UrlHelper(reqContext, System.Web.Routing.RouteTable.Routes);

        // Can now use the helper to generate Url for the named route!
        mvcRouteUrl = helper.Action(routeName, null, routeValues, HttpContext.Current.Request.Url.Scheme);

        return mvcRouteUrl;
    }

它有点原始,但为我完成了这项工作,只是想我会把它放在这里以防其他人遇到同样的问题!

答案 2 :(得分:1)

MVC和Web API的路由表完全不同。虽然语法看起来类似,但它们操作的路由表是不同的。

但是,MVC使用静态对象进行配置,因此您可以使用System.Web.Routing.RouteTable.Routes从API控制器中访问全局MVC路由表。

但是,这不允许您使用Url.Link,因此我建议您在路线注册中使用常量格式。