Llame a UrlHelper en modelos en ASP.NET MVC

Necesito generar algunas URL en un modelo en ASP.NET MVC. Me gustaría llamar a algo como UrlHelper.Action () que usa las rutas para generar la URL. No me importa llenar los espacios en blanco habituales, como el nombre de host, el esquema, etc.

¿Hay algún método que pueda llamar para eso? ¿Hay alguna manera de construir un UrlHelper?

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; } } 

Llamar a la propiedad Link en un objeto MyModel creado devolverá la URL válida para ver el modelo en función del enrutamiento en Global.asax

Me gusta la respuesta de Omar, pero eso no funciona para mí. Solo para que quede registrado, esta es la solución que estoy usando ahora:

 var httpContext = HttpContext.Current; if (httpContext == null) { var request = new HttpRequest("/", "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 del Controlador con lo siguiente:

  var url = new UrlHelper(this.ControllerContext.RequestContext); url.Action(...); 

Fuera de un controlador, se puede construir un UrlHelper creando un RequestContext desde 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 corrección de código menor añadida).

Sí, puedes instanciarlo. Puedes hacer algo como:

 var ctx = new HttpContextWrapper(HttpContext.Current); UrlHelper helper = new UrlHelper( new RequestContext(ctx, RouteTable.Routes.GetRouteData(ctx)); 

RouteTable.Routes es una propiedad estática, por lo que debería estar bien allí; para obtener una referencia HttpContextBase , HttpContextWrapper toma una referencia a HttpContext , y HttpContext proporciona.

Después de probar todas las otras respuestas, terminé con

 $"/api/Things/Action/{id}" 

Los enemigos odiarán ¯ \ _ (ツ) _ / ¯

Intentaba hacer algo similar desde dentro de una página (fuera de un controlador).

UrlHelper no me permitió construirlo tan fácilmente como la respuesta de Pablos, pero luego recordé un viejo truco para hacer lo mismo:

 string ResolveUrl(string pathWithTilde) 

Creo que lo que estás buscando es esto:

 Url.Action("ActionName", "ControllerName");