/// <summary>
    /// Generates a fully qualified URL to an action method
    /// </summary>
    public static string Action <TController>(this UrlHelper urlHelper, Expression <Action <TController> > action)
        where TController : Controller
    {
        RouteValueDictionary rvd = InternalExpressionHelper.GetRouteValues(action);

        return(urlHelper.Action(null, null, rvd));
    }
    public static string HttpRouteUrl <TController>(this UrlHelper urlHelper, Expression <Action <TController> > action)
        where TController : System.Web.Http.Controllers.IHttpController
    {
        var routeValues  = InternalExpressionHelper.GetRouteValues(action);
        var httpRouteKey = System.Web.Http.Routing.HttpRoute.HttpRouteKey;

        if (!routeValues.ContainsKey(httpRouteKey))
        {
            routeValues.Add(httpRouteKey, true);
        }
        var url = string.Empty;

        if (routeValues.ContainsKey(HttpAttributeRouteWebApiKey))
        {
            var routeName = routeValues[HttpAttributeRouteWebApiKey] as string;
            routeValues.Remove(HttpAttributeRouteWebApiKey);
            routeValues.Remove("controller");
            routeValues.Remove("action");
            url = urlHelper.HttpRouteUrl(routeName, routeValues);
        }
        else
        {
            var path = resolvePath <TController>(routeValues);
            var root = getRootPath(urlHelper);
            url = root + path;
        }
        return(url);
    }