c# - from - Obtención de la URL completa de la acción en ASP.NET MVC
url content c# (6)
Como mencionó Paddy: si usa una sobrecarga de UrlHelper.Action()
que especifica explícitamente 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 crear URL de acción absolutas utilizando la clase UrlHelper en la que sugiero escribir un método de extensión personalizado por motivos de legibilidad:
/// <summary>
/// Generates a fully qualified URL to an action method by using
/// the specified action name, controller name and route values.
/// </summary>
/// <param name="url">The URL helper.</param>
/// <param name="actionName">The name of the action method.</param>
/// <param name="controllerName">The name of the controller.</param>
/// <param name="routeValues">The route values.</param>
/// <returns>The absolute URL.</returns>
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")
Esta pregunta ya tiene una respuesta aquí:
¿Existe una forma integrada 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 codificación 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.
Esta pregunta es específica de ASP .NET; sin embargo, estoy seguro de que algunos de ustedes se beneficiarán del sistema javascript que es beneficioso en muchas situaciones.
ACTUALIZACIÓN: La forma de obtener la url formada fuera de la página en sí está bien descrita en las respuestas anteriores.
O podrías 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"
);
del filtro o
new UrlHelper(this.Request.RequestContext).Action(
"Details",
"Journey",
new { area = productType },
this.Request.Url!= null? this.Request.Url.Scheme : "http"
);
Sin embargo, muy a menudo, uno necesita obtener la URL de la página actual, para los casos en los que se usa Html.Action
y se pone incómodo el nombre y el controlador de la página en la que estás. 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-formas medio vb-script medio Dios sabe qué y para obtener la URL de la página actual se necesita usar un método diferente cada vez.
Una forma es usar JavaScript para obtener la URL es window.location.href
another - document.URL
Esto es lo que necesitas hacer.
@Url.Action(action,controller, null, Request.Url.Scheme)
Esto puede ser solo que yo sea realmente muy exigente, pero me gusta definir constantes solo una vez. Si utiliza alguno de los enfoques definidos anteriormente, su constante de acción se definirá varias veces.
Para evitar esto, puedes 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 cree sus controladores, digamos, por ejemplo, el controlador de datos:
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 tu .cshtml (o cualquier código)
<ul>
<li><a href="@ControllerRoutes.Data.Dog">Dog</a></li>
<li><a href="@ControllerRoutes.Data.Cat">Cat</a></li>
</ul>
Definitivamente es mucho más trabajo, pero me siento fácil sabiendo que la validación del tiempo de compilación está de mi lado.
Existe una sobrecarga de Url.Action que toma su protocolo deseado (por ejemplo, http, https) como un argumento: si lo especifica, obtiene una URL completa.
Aquí hay un ejemplo que utiliza 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 la maquinilla de afeitar para crear un elemento de anclaje, pero también requiere los parámetros hostName y fragment. Así que solo optaría por usar @ Url.Action de nuevo:
<span>
Copy
<a href=''@Url.Action("About", "Home", null, Request.Url.Scheme)''>this link</a>
and post it anywhere on the internet!
</span>
Tenía un problema con esto, mi servidor se estaba ejecutando detrás de un equilibrador de carga. El equilibrador de carga estaba terminando la conexión SSL / TLS. Luego pasó la solicitud a los servidores web utilizando http.
Usando 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ó).
Puede que haya hecho un poco de trampa, pero es exactamente lo que necesitaba para forzar una URL https:
<a href="@Url.Action("Action", "Controller", new { id = Model.Id }, "https")">Click Here</a>
En realidad, uso un web.config AppSetting para poder usar http al depurar localmente, pero todos los entornos de prueba y producción utilizan la transformación para establecer el valor https.