Crear una URL en el controlador .NET MVC

131

Necesito poder construir un enlace en la Acción en el controlador para enviar un correo electrónico. ¿Cuál es la mejor práctica para hacer esto? No quiero construirlo yo mismo en caso de que cambien mis rutas.

¿Debo tener una vista para cada correo electrónico y representarlo y enviarlo? Esa podría ser una buena forma de hacerlo.

ScottBelchak
fuente

Respuestas:

230

Si solo desea obtener el camino hacia una determinada acción, use UrlHelper:

UrlHelper u = new UrlHelper(this.ControllerContext.RequestContext);
string url = u.Action("About", "Home", null);

si quieres crear un hipervínculo:

string link = HtmlHelper.GenerateLink(this.ControllerContext.RequestContext, System.Web.Routing.RouteTable.Routes, "My link", "Root", "About", "Home", null, null);

Intellisense le dará el significado de cada uno de los parámetros.


Actualización de los comentarios : el controlador ya tiene un UrlHelper:

string url = this.Url.Action("About", "Home", null); 
Gidon
fuente
17
Seguimiento: para el penúltimo parámetro (el RouteValueDictionary) aquí hay un ejemplo: nuevo System.Web.Routing.RouteValueDictionary (new {id = 1})
Matthew M.
15
No necesita construir un nuevo UrlHelper; hay una propiedad .Url en el controlador que le dará una con el RequestContext correcto.
Tobias J
¿De dónde viene "Root"? Si tengo que codificar el nombre de la ruta que estoy tratando de hacer coincidir, ¿por qué no simplemente codificar la URL?
xr280xr
@ xr280xr: Creo que en este ejemplo "Root" es el nombre de la ruta como se define en el método RegisterRoutes (generalmente en RouteConfig). Para mí, era "Predeterminado" (como cuando creé mi proyecto).
Andy
3
No necesita renovar un UrlHelper, solo acceda a la propiedad Url en la clase Controlador.
Jay Douglass
22

Si necesita la URL completa (por ejemplo, para enviar por correo electrónico) considere usar uno de los siguientes métodos integrados:

Con esto, crea la ruta a utilizar para construir la url:

Url.RouteUrl("OpinionByCompany", new RouteValueDictionary(new{cid=newop.CompanyID,oid=newop.ID}), HttpContext.Request.Url.Scheme, HttpContext.Request.Url.Authority)

Aquí la url se crea después de que el motor de ruta determine la correcta:

Url.Action("Detail","Opinion",new RouteValueDictionary(new{cid=newop.CompanyID,oid=newop.ID}),HttpContext.Request.Url.Scheme, HttpContext.Request.Url.Authority)

En ambos métodos, los últimos 2 parámetros especifican el protocolo y el nombre de host.

Saludos.

andresfiuba
fuente
77
Para su información, Url.Action(action, controller, routevalue, protocol)también produce una URL completa, por lo que no tiene que especificar el nombre de host si no es necesario.
Endy Tjahjono
1
Recibo la siguiente URL con el número de puerto duplicado, ¿cómo puedo solucionar esto, por favor? http: // localhost: 54383: 54383 / MyArea / MyController / Details / 1
Patee Gutee
12

Tuve el mismo problema, y ​​parece que la respuesta de Gidon tiene una pequeña falla: genera una URL relativa, que no se puede enviar por correo.

Mi solución se ve así:

string link = HttpContext.Request.Url.Scheme + "://" + HttpContext.Request.Url.Authority + Url.Action("ResetPassword", "Account", new { key = randomString });

De esta forma, se genera una URL completa, y funciona incluso si la aplicación tiene varios niveles de profundidad en el servidor de alojamiento y utiliza un puerto que no sea 80.

EDITAR: También encontré esto útil.

Moshe
fuente
Tenga en cuenta que esto tiene una gran vulnerabilidad de seguridad. Todo lo que se necesitaría es que alguien modifique el encabezado de la solicitud para que contenga una URL maliciosa como host y su aplicación envíe un correo electrónico oficial que contenga un enlace a un sitio web peligroso.
V0ldek
7

Otra forma de crear una URL absoluta para una acción:

var relativeUrl = Url.Action("MyAction");  //..or one of the other .Action() overloads
var currentUrl = Request.Url;

var absoluteUrl = new System.Uri(currentUrl, relativeUrl);
Sphinxxx
fuente
4

Sé que esta es una vieja pregunta, pero en caso de que esté tratando de hacer lo mismo en ASP.NET Core, así es como puede crear UrlHelper dentro de una acción:

var urlHelper = new UrlHelper(this.ControllerContext);

O bien, podría usar la Controller.Urlpropiedad si hereda de Controller.

Darren
fuente