Saltar al contenido

Llamar a UrlHelper en modelos en ASP.NET MVC

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).

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *