Jak uzyskać bieżący adres URL w widoku w asp.net core 1.0

Odpowiedzi:

122

Musisz osobno uzyskać hosta i ścieżkę.

 @[email protected]
Clint B.
źródło
14
Nie spowoduje to zgłoszenia prawidłowego adresu URL, jeśli aplikacja znajduje się w katalogu wirtualnym. Trzeba będzie poprzedzić Request.Path wartość z Request.PathBase wartości, jeżeli taki istnieje. Dotyczy to również prawie wszystkich innych odpowiedzi na to pytanie.
padigan
Co to jest @między dwoma strunami? czy mógłbyś to wyjaśnić?
Mohammed Noureldin
3
@MohammedNoureldin: to jest składnia widoku brzytwy.
jack.pop
2
W przypadku stron z ostrzami musiałem użyć @HttpContextzamiast @Context. W przypadku widoków częściowych @Contextdziała. Czy zapomniałem o użyciu?
Andriod
2
Istnieje łatwy sposób na Url.Action("Action", null, null, Request.Url.Scheme); stackoverflow
Dan
110

Potrzebujesz schematu, hosta, ścieżki i zapytania

@string.Format("{0}://{1}{2}{3}", Context.Request.Scheme, Context.Request.Host, Context.Request.Path, Context.Request.QueryString)

lub używając nowej funkcji C # 6 „Interpolacja ciągów”

@($"{Context.Request.Scheme}://{Context.Request.Host}{Context.Request.Path}{Context.Request.QueryString}")
tmg
źródło
1
Jak uzyskać fragment, powiedz test.com/abc#123 , jak uzyskać fragment # 123 z żądania?
Ray
4
@fanray Nie możesz. Przeglądarki nie wysyłają fragmentów URI do serwera
tmg
Rozważ użycie UriBuilder do tworzenia adresów URL.
Erik Philips
84

Możesz użyć metody rozszerzenia Request:

Request.GetDisplayUrl()
AlexBar
źródło
33
To działa, jeśli dodasz @using Microsoft.AspNetCore.Http.Extensionswtedy@Context.Request.GetDisplayUrl()
Serj Sagan,
2
wciąż otrzymuję - Żądanie nie istnieje w bieżącym kontekście
SeanMC
1
Pamiętaj, że podsumowanie funkcji Intellisense dla tej funkcji mówi, że Suitable only for display. This format should not be used in HTTP headers or other HTTP operations.na tej podstawie myślę, że rozwiązanie @ tmg jest najlepsze (być może zapakowane w twoją własną metodę rozszerzenia).
Gordon Glas
16

Najwyraźniej było to zawsze możliwe w .net core 1.0 z Microsoft.AspNetCore.Http.Extensions, który dodaje rozszerzenie, HttpRequestaby uzyskać pełny adres URL; GetEncodedUrl .

np. z widoku brzytwy:

@using Microsoft.AspNetCore.Http.Extensions
...
<a href="@Context.Request.GetEncodedUrl()">Link to myself</a>

Od wersji 2.0 mają również ścieżkę względną i zapytanie GetEncodedPathAndQuery .

mcNux
źródło
15

Użyj właściwości AbsoluteUri Uri, z .Net core musisz zbudować Uri na podstawie takiego żądania,

 var location = new Uri($"{Request.Scheme}://{Request.Host}{Request.Path}{Request.QueryString}");

 var url = location.AbsoluteUri;

np. jeśli adres URL żądania to „ http://www.contoso.com/catalog/shownew.htm?date=today ”, to zwróci ten sam adres URL.

Dhanuka777
źródło
8
Takie rzeczy sprawiają, że myślę, że .Net Core jest pod pewnymi względami krokiem wstecz. Czy to lepsze niż Request.Url w Asp.Net w jakiś sposób, którego nie mogę sobie wyobrazić?
Soenhay,
8

Możesz rozważyć użycie tej metody rozszerzenia (z Microsoft.AspNetCore.Http.Extensionsprzestrzeni nazw:

@Context.Request.GetDisplayUrl()

W przypadku niektórych projektów preferuję bardziej elastyczne rozwiązania. Istnieją dwie metody rozszerzeń.

1) Pierwsza metoda tworzy Uriobiekt z przychodzących danych żądania (z niektórymi wariantami poprzez opcjonalne parametry). 2) Druga metoda odbiera Uriobiekt i zwraca stringw następującym formacie (bez końcowego ukośnika): 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);
    }

Stosowanie:

//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
user3172616
źródło
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);
}
Siergiej
źródło
ale dokąd zmierzasz httpContext? To nie zadziała Microsoft.AspNetCore.Http.HttpContext.Request
Tom Stickel
7

Jeśli chcesz również uzyskać numer portu z żądania, musisz uzyskać do niego dostęp za pośrednictwem Request.Hostwłaściwości dla AspNet Core.

Request.HostNieruchomość nie jest po prostu ciąg, ale zamiast tego, obiekt, który posiada zarówno domenę hosta i numer portu. Jeśli numer portu jest specjalnie rozpisane w adresie URL (tj "https://example.com:8080/path/to/resource"), a następnie wywołanie Request.Hostdaje domenę hosta i numer portu, jak tak: "example.com:8080".

Jeśli potrzebujesz tylko wartości dla domeny hosta lub tylko numeru portu, możesz uzyskać dostęp do tych właściwości indywidualnie (tj. Request.Host.HostLub Request.Host.Port).

Hallmanac
źródło
6

Zaakceptowana odpowiedź pomogła mi, podobnie jak komentarz do niej z @padigan, ale jeśli chcesz dołączyć parametry ciągu zapytania, tak jak w moim przypadku, spróbuj tego:

@[email protected]()

@using Microsoft.AspNetCore.Http.ExtensionsAby metoda GetEncodedPathAndQuery () była dostępna, musisz dodać widok.

Christopher King
źródło
1

Istnieje czysty sposób uzyskania bieżącego adresu URL ze strony Razor lub klasy PageModel. To jest:

Url.PageLink()

Zwróć uwagę, że miałem na myśli „ASP.NET Core Razor Pages ”, a nie MVC.

Używam tej metody, gdy chcę wydrukować metatag kanonicznego adresu URL na stronach maszynki do golenia ASP.NET Core. Ale jest w tym haczyk. Otrzymasz adres URL, który powinien być właściwym adresem URL dla tej strony. Pozwól mi wyjaśnić.

Powiedzmy, że zdefiniowałeś trasę o nazwie „id” dla swojej strony i dlatego Twój adres URL powinien wyglądać tak

http://example.com/product?id=34

Url.PageLink () poda dokładnie ten adres URL, jak pokazano powyżej.

Jeśli użytkownik doda coś więcej do tego adresu URL, powiedzmy,

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

Wtedy nie uzyskasz tego „somethingElse” z tej metody. Właśnie dlatego jest dokładnie dobry do drukowania metatagu kanonicznego adresu URL na stronie HTML.

Emran Hussain
źródło