Solución:
Consejo útil: en cualquier aplicación ASP.NET, puede obtener una referencia del HttpContext actual
HttpContext.Current
que se deriva de System.Web. Por lo tanto, lo siguiente funcionará en cualquier lugar de una aplicación ASP.NET MVC:
UrlHelper url = new UrlHelper(HttpContext.Current.Request.RequestContext);
url.Action("ContactUs"); // Will output the proper link according to routing info
Ejemplo:
public class MyModel
{
public int ID { get; private set; }
public string Link
{
get
{
UrlHelper url = new UrlHelper(HttpContext.Current.Request.RequestContext);
return url.Action("ViewAction", "MyModelController", new { id = this.ID });
}
}
public MyModel(int id)
{
this.ID = id;
}
}
Llamando al Link
La propiedad en un objeto MyModel creado devolverá la URL válida para ver el modelo según el enrutamiento en Global.asax
Me gusta la respuesta de Omar, pero no me funciona. Solo para que conste, esta es la solución que estoy usando ahora:
var httpContext = HttpContext.Current;
if (httpContext == null) {
var request = new HttpRequest("https://foroayuda.es/", "http://example.com", "");
var response = new HttpResponse(new StringWriter());
httpContext = new HttpContext(request, response);
}
var httpContextBase = new HttpContextWrapper(httpContext);
var routeData = new RouteData();
var requestContext = new RequestContext(httpContextBase, routeData);
return new UrlHelper(requestContext);
Un UrlHelper se puede construir desde dentro de una acción de Controller con lo siguiente:
var url = new UrlHelper(this.ControllerContext.RequestContext);
url.Action(...);
Fuera de un controlador, se puede construir un UrlHelper creando un RequestContext a partir de RouteTable.Routes RouteData.
HttpContextWrapper httpContextWrapper = new HttpContextWrapper(System.Web.HttpContext.Current);
UrlHelper urlHelper = new UrlHelper(new RequestContext(httpContextWrapper, RouteTable.Routes.GetRouteData(httpContextWrapper)));
(Basado en la respuesta de Brian, con una pequeña corrección de código agregada).