Using
@Charlino 's answer as a guide, I came up with this.
The ASP.NET MVC RC1 source code for UrlHelper shows that Url.Action will return a fully-qualified Url if a hostname and protocol are passed in. I created these helpers to force the hostname and protocol to be provided. The multiple overloads mirror the overloads for Url.Action:
using System.Web.Routing;
namespace System.Web.Mvc {
public static class HtmlExtensions {
public static string AbsoluteAction(this UrlHelper url, string actionName) {
Uri requestUrl = url.RequestContext.HttpContext.Request.Url;
return url.Action(actionName, null, (RouteValueDictionary)null, requestUrl.Scheme, requestUrl.Authority);
}
public static string AbsoluteAction(this UrlHelper url, string actionName, object routeValues) {
Uri requestUrl = url.RequestContext.HttpContext.Request.Url;
return url.Action(actionName, null, new RouteValueDictionary(routeValues), requestUrl.Scheme, requestUrl.Authority);
}
public static string AbsoluteAction(this UrlHelper url, string actionName, RouteValueDictionary routeValues) {
Uri requestUrl = url.RequestContext.HttpContext.Request.Url;
return url.Action(actionName, null, routeValues, requestUrl.Scheme, requestUrl.Authority);
}
public static string AbsoluteAction(this UrlHelper url, string actionName, string controllerName) {
Uri requestUrl = url.RequestContext.HttpContext.Request.Url;
return url.Action(actionName, controllerName, (RouteValueDictionary)null, requestUrl.Scheme, requestUrl.Authority);
}
public static string AbsoluteAction(this UrlHelper url, string actionName, string controllerName, object routeValues) {
Uri requestUrl = url.RequestContext.HttpContext.Request.Url;
return url.Action(actionName, controllerName, new RouteValueDictionary(routeValues), requestUrl.Scheme, requestUrl.Authority);
}
public static string AbsoluteAction(this UrlHelper url, string actionName, string controllerName, RouteValueDictionary routeValues) {
Uri requestUrl = url.RequestContext.HttpContext.Request.Url;
return url.Action(actionName, controllerName, routeValues, requestUrl.Scheme, requestUrl.Authority);
}
public static string AbsoluteAction(this UrlHelper url, string actionName, string controllerName, object routeValues, string protocol) {
Uri requestUrl = url.RequestContext.HttpContext.Request.Url;
return url.Action(actionName, controllerName, new RouteValueDictionary(routeValues), protocol, requestUrl.Authority);
}
}
}