Obteniendo la URL completa de acción en ASP.NET MVC

¿Hay una forma incorporada de obtener la URL completa de una acción?

Estoy buscando algo como GetFullUrl("Action", "Controller") que devolvería algo como http://www.fred.com/Controller/Action .

El motivo por el que busco esto es evitar las URL de encoding rígida en los correos electrónicos automáticos que se generan para que las URL siempre se puedan generar en relación con la ubicación actual del sitio.

Hay una sobrecarga de Url.Action que toma el protocolo deseado (por ejemplo, http, https) como argumento: si especifica esto, obtiene una URL completamente calificada.

Aquí hay un ejemplo que usa el protocolo de la solicitud actual en un método de acción:

 var fullUrl = this.Url.Action("Edit", "Posts", new { id = 5 }, this.Request.Url.Scheme); 

HtmlHelper (@Html) también tiene una sobrecarga del método ActionLink que puede usar en razor para crear un elemento de anclaje, pero también requiere los parámetros hostName y fragment. Así que optaría por usar @ Url.Action nuevamente:

  Copy this link and post it anywhere on the internet!  

Como UrlHelper.Action() Paddy: si usas una sobrecarga de UrlHelper.Action() que explícitamente especifica el protocolo a usar, la URL generada será absoluta y completamente calificada en lugar de ser relativa.

Escribí una publicación de blog llamada Cómo construir URLs de acción absoluta utilizando la clase UrlHelper en la que sugiero que se escriba un método de extensión personalizado por el bien de la legibilidad:

 ///  /// Generates a fully qualified URL to an action method by using /// the specified action name, controller name and route values. ///  /// The URL helper. /// The name of the action method. /// The name of the controller. /// The route values. /// The absolute URL. public static string AbsoluteAction(this UrlHelper url, string actionName, string controllerName, object routeValues = null) { string scheme = url.RequestContext.HttpContext.Request.Url.Scheme; return url.Action(actionName, controllerName, routeValues, scheme); } 

Entonces puedes simplemente usarlo así en tu vista:

 @Url.AbsoluteAction("Action", "Controller") 

Puede que solo sea yo realmente exigente, pero solo me gusta definir constantes una vez. Si usa cualquiera de los enfoques definidos anteriormente, su constante de acción se definirá varias veces.

Para evitar esto, puede hacer lo siguiente:

  public class Url { public string LocalUrl { get; } public Url(string localUrl) { LocalUrl = localUrl; } public override string ToString() { return LocalUrl; } } public abstract class Controller { public Url RootAction => new Url(GetUrl()); protected abstract string Root { get; } public Url BuildAction(string actionName) { var localUrl = GetUrl() + "/" + actionName; return new Url(localUrl); } private string GetUrl() { if (Root == "") { return ""; } return "/" + Root; } public override string ToString() { return GetUrl(); } } 

Luego crea tus controladores, digamos por ejemplo el DataController:

  public static readonly DataController Data = new DataController(); public class DataController : Controller { public const string DogAction = "dog"; public const string CatAction = "cat"; public const string TurtleAction = "turtle"; protected override string Root => "data"; public Url Dog => BuildAction(DogAction); public Url Cat => BuildAction(CatAction); public Url Turtle => BuildAction(TurtleAction); } 

Entonces solo úsalo como:

  // GET: Data/Cat [ActionName(ControllerRoutes.DataController.CatAction)] public ActionResult Etisys() { return View(); } 

Y desde su .cshtml (o cualquier código)

  

Definitivamente este es mucho más trabajo, pero estoy tranquilo sabiendo que la validación en tiempo de comstackción está de mi lado.

Esto es lo que debes hacer

 https://stackoverflow.com/questions/2005367/getting-full-url-of-action-in-asp-net-mvc/@Url.Action(action,controller, null, Request.Url.Scheme) 

Estaba teniendo un problema con esto, mi servidor se estaba ejecutando detrás de un balanceador de carga. El equilibrador de carga estaba terminando la conexión SSL / TLS. Luego pasó la solicitud a los servidores web usando http.

Al usar el método Url.Action () con Request.Url.Schema, siguió creando una url http, en mi caso para crear un enlace en un correo electrónico automático (que a mi PenTester no le gustó).

Pude haber engañado un poco, pero es exactamente lo que necesitaba forzar una url https:

 Click Here 

De hecho, uso un AppSetting web.config para poder usar http cuando se depura localmente, pero todos los entornos de prueba y prueba usan transformación para establecer el valor https.

Esta pregunta es específica de ASP .NET. Sin embargo, estoy seguro de que algunos de ustedes se beneficiarán de javascript independiente del sistema que es beneficioso en muchas situaciones.

ACTUALIZACIÓN: la forma de obtener URL fuera de la página está bien descrita en las respuestas anteriores.

O podría hacer un oneliner como el siguiente:

 new UrlHelper(actionExecutingContext.RequestContext).Action( "SessionTimeout", "Home", new {area = string.Empty}, actionExecutingContext.Request.Url!= null? actionExecutingContext.Request.Url.Scheme : "http" ); 

de filtro o:

 new UrlHelper(this.Request.RequestContext).Action( "Details", "Journey", new { area = productType }, this.Request.Url!= null? this.Request.Url.Scheme : "http" ); 

Sin embargo, con bastante frecuencia uno necesita obtener la url de la página actual, para aquellos casos que usan Html.Action y poner el nombre y el controlador de la página en la que me encuentras se siente incómodo. Mi preferencia en tales casos es usar JavaScript en su lugar. Esto es especialmente bueno en sistemas que están medio reescritos MVT medio web-forms medio vb-script medio Dios sabe qué – y para obtener el URL de la página actual uno necesita usar un método diferente cada vez.

Una forma es usar JavaScript para obtener la URL es window.location.href another – document.URL