Cómo obtener la URL actual a la vista en asp.net core 1.0

Respuestas:

121

Debe obtener el host y la ruta por separado.

 @[email protected]
Clint B
fuente
14
Esto no informará la URL correcta si su aplicación se encuentra en un directorio virtual. Deberá anteponer el valor Request.Path con el valor Request.PathBase si hay uno. Esto también se aplica a casi todas las demás respuestas a esta pregunta.
padigan
¿Qué es esto @entre las dos cadenas? ¿podrías explicarlo?
Mohammed Noureldin
3
@MohammedNoureldin: esa es la sintaxis de vista de afeitar.
jack.pop
2
Para las páginas de la navaja tuve que usar en @HttpContextlugar de @Context. Para vistas parciales @Contextfunciona. ¿Olvidé un uso?
Andriod
2
Hay una manera fácil en MVC Url.Action("Action", null, null, Request.Url.Scheme); stackoverflow.com/questions/434604/…
Dan
110

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}")
tmg
fuente
1
¿Cómo se obtiene el fragmento, digamos test.com/abc#123 , cómo se obtiene el fragmento # 123 de la solicitud?
Ray
4
@fanray No puedes. Los navegadores no envían fragmentos de URI al servidor
tmg
Considere utilizar UriBuilder para crear URL.
Erik Philips
84

Puede utilizar el método de extensión de Request:

Request.GetDisplayUrl()
AlexBar
fuente
33
Esto funciona si agrega @using Microsoft.AspNetCore.Http.Extensionsentonces@Context.Request.GetDisplayUrl()
Serj Sagan
2
todavía obteniendo - La solicitud no existe en el contexto actual
SeanMC
1
Tenga en cuenta que el resumen de intellisense para esta función dice 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).
Gordon Glas
16

Aparentemente, esto siempre fue posible en .net core 1.0 con Microsoft.AspNetCore.Http.Extensions, que agrega extensión HttpRequestpara 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 .

mcNux
fuente
15

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.

Dhanuka777
fuente
8
Cosas como esta me hacen pensar que .Net Core es un paso atrás en algunos aspectos. ¿Es esto mejor que Request.Url en Asp.Net de alguna manera que no puedo imaginar?
Soenhay
8

Puede considerar utilizar este método de extensión (del Microsoft.AspNetCore.Http.Extensionsespacio 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 Uriobjeto 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 Uriobjeto y lo devuelve stringen 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&param2=b
        Request.GetUri(addQuery: false);
        //after >> https://localhost:44304/information/about

        //before >> https://localhost:44304/information/about?param1=a&param2=b
        new Uri("https://localhost:44304/information/about?param1=a&param2=b").GetHostWithNoSlash();
        //after >> https://localhost:44304
usuario3172616
fuente
7
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);
}
Sergey
fuente
pero donde quieres llegar httpContext? Eso no va a funcionar con Microsoft.AspNetCore.Http.HttpContext.Request
Tom Stickel
7

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.Hostpropiedad 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.Hostle 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.Hosto Request.Host.Port).

Hallmanac
fuente
6

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:

@[email protected]()

Y deberá agregar @using Microsoft.AspNetCore.Http.Extensionsla vista para que el método GetEncodedPathAndQuery () esté disponible.

Christopher King
fuente
1

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

http://www.myWebsite.com/product?id=34

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:

http://www.myWebsite.com/product?id=34&somethingElse

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.

Emran Hussain
fuente