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.

 @Context.Request.Host@Context.Request.Path

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}")

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()

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 .


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.


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

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);
}

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).


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:

@Context.Request.PathBase@Context.Request.GetEncodedPathAndQuery()

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


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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.