En versiones anteriores de asp.net, podríamos usar
@Request.Url.AbsoluteUri
Pero parece que ha cambiado. ¿Cómo podemos hacer eso en asp.net core 1.0?
En versiones anteriores de asp.net, podríamos usar
@Request.Url.AbsoluteUri
Pero parece que ha cambiado. ¿Cómo podemos hacer eso en asp.net core 1.0?
Respuestas:
Debe obtener el host y la ruta por separado.
@Context.Request.Host@Context.Request.Path
@
entre las dos cadenas? ¿podrías explicarlo?
@HttpContext
lugar de @Context
. Para vistas parciales @Context
funciona. ¿Olvidé un uso?
Url.Action("Action", null, null, Request.Url.Scheme);
stackoverflow.com/questions/434604/…
Necesita esquema, host, ruta y queryString
@string.Format("{0}://{1}{2}{3}", Context.Request.Scheme, Context.Request.Host, Context.Request.Path, Context.Request.QueryString)
o usando la nueva función de C # 6 "Interpolación de cadenas"
@($"{Context.Request.Scheme}://{Context.Request.Host}{Context.Request.Path}{Context.Request.QueryString}")
Puede utilizar el método de extensión de Request
:
Request.GetDisplayUrl()
@using Microsoft.AspNetCore.Http.Extensions
entonces@Context.Request.GetDisplayUrl()
Suitable only for display. This format should not be used in HTTP headers or other HTTP operations.
Basado en esto, creo que la solución de @ tmg es la mejor (quizás envuelta en su propio método de extensión).
Aparentemente, esto siempre fue posible en .net core 1.0 con Microsoft.AspNetCore.Http.Extensions
, que agrega extensión HttpRequest
para obtener la URL completa; GetEncodedUrl .
por ejemplo, desde la vista de la navaja:
@using Microsoft.AspNetCore.Http.Extensions
...
<a href="@Context.Request.GetEncodedUrl()">Link to myself</a>
Desde 2.0, también tiene una ruta relativa y consulta GetEncodedPathAndQuery .
Use la propiedad AbsoluteUri de Uri, con .Net core debe construir el Uri a partir de una solicitud como esta,
var location = new Uri($"{Request.Scheme}://{Request.Host}{Request.Path}{Request.QueryString}");
var url = location.AbsoluteUri;
por ejemplo, si la URL de la solicitud es ' http://www.contoso.com/catalog/shownew.htm?date=today ', esto devolverá la misma URL.
Puede considerar utilizar este método de extensión (del Microsoft.AspNetCore.Http.Extensions
espacio de nombres:
@Context.Request.GetDisplayUrl()
Para algunos de mis proyectos prefiero una solución más flexible. Hay dos métodos de extensión.
1) El primer método crea un Uri
objeto a partir de los datos de solicitud entrantes (con algunas variantes a través de parámetros opcionales). 2) El segundo método recibe el Uri
objeto y lo devuelve string
en el siguiente formato (sin barra diagonal al final): Scheme_Host_Port
public static Uri GetUri(this HttpRequest request, bool addPath = true, bool addQuery = true)
{
var uriBuilder = new UriBuilder
{
Scheme = request.Scheme,
Host = request.Host.Host,
Port = request.Host.Port.GetValueOrDefault(80),
Path = addPath ? request.Path.ToString() : default(string),
Query = addQuery ? request.QueryString.ToString() : default(string)
};
return uriBuilder.Uri;
}
public static string HostWithNoSlash(this Uri uri)
{
return uri.GetComponents(UriComponents.SchemeAndServer, UriFormat.UriEscaped);
}
Uso:
//before >> https://localhost:44304/information/about?param1=a¶m2=b
Request.GetUri(addQuery: false);
//after >> https://localhost:44304/information/about
//before >> https://localhost:44304/information/about?param1=a¶m2=b
new Uri("https://localhost:44304/information/about?param1=a¶m2=b").GetHostWithNoSlash();
//after >> https://localhost:44304
public string BuildAbsolute(PathString path, QueryString query = default(QueryString), FragmentString fragment = default(FragmentString))
{
var rq = httpContext.Request;
return Microsoft.AspNetCore.Http.Extensions.UriHelper.BuildAbsolute(rq.Scheme, rq.Host, rq.PathBase, path, query, fragment);
}
httpContext
? Eso no va a funcionar con Microsoft.AspNetCore.Http.HttpContext.Request
Si también está buscando obtener el número de puerto de la solicitud, deberá acceder a él a través delRequest.Host
propiedad de AspNet Core.
La Request.Host
propiedad no es simplemente una cadena, sino un objeto que contiene tanto el dominio de host como el número de puerto. Si el número de puerto está específicamente escrito a cabo en la URL (es decir "https://example.com:8080/path/to/resource"
), a continuación, llamar Request.Host
le dará el dominio de host y el número de puerto de esta manera: "example.com:8080"
.
Si solo desea el valor para el dominio de host o solo desea el valor para el número de puerto, puede acceder a esas propiedades individualmente (es decir, Request.Host.Host
o Request.Host.Port
).
La respuesta aceptada me ayudó, al igual que el comentario de @padigan, pero si desea incluir los parámetros de la cadena de consulta como fue mi caso, intente esto:
@Context.Request.PathBase@Context.Request.GetEncodedPathAndQuery()
Y deberá agregar @using Microsoft.AspNetCore.Http.Extensions
la vista para que el método GetEncodedPathAndQuery () esté disponible.
Existe una forma limpia de obtener la URL actual de una página de Razor o una clase de PageModel. Es decir:
Url.PageLink()
Tenga en cuenta que me refiero a las "ASP.NET Core Razor Pages", no al MVC.
Utilizo este método cuando quiero imprimir la metaetiqueta URL canónica en las páginas de la maquinilla de afeitar ASP.NET Core. Pero hay una trampa. Le dará la URL que se supone que es la URL correcta para esa página. Dejame explicar.
Digamos, de acuerdo con la ruta que definió para una página, su URL debería verse como
Digamos que ha definido una ruta "Id" para su página. Entonces, Url.PageLink () le dará exactamente esa URL. Si el usuario agrega algo adicional en esa URL, diga:
Entonces, no obtendrá ese "somethingElse" de este método. Y es por eso que es exactamente bueno para imprimir metaetiquetas URL canónicas en la página HTML.