W poprzednich wersjach asp.net mogliśmy użyć
@Request.Url.AbsoluteUri
Ale wydaje się, że to się zmieniło. Jak możemy to zrobić w asp.net core 1.0?
W poprzednich wersjach asp.net mogliśmy użyć
@Request.Url.AbsoluteUri
Ale wydaje się, że to się zmieniło. Jak możemy to zrobić w asp.net core 1.0?
Odpowiedzi:
Musisz osobno uzyskać hosta i ścieżkę.
@Context.Request.Host@Context.Request.Path
@
między dwoma strunami? czy mógłbyś to wyjaśnić?
@HttpContext
zamiast @Context
. W przypadku widoków częściowych @Context
działa. Czy zapomniałem o użyciu?
Url.Action("Action", null, null, Request.Url.Scheme);
stackoverflow
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}")
Możesz użyć metody rozszerzenia Request
:
Request.GetDisplayUrl()
@using Microsoft.AspNetCore.Http.Extensions
wtedy@Context.Request.GetDisplayUrl()
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).
Najwyraźniej było to zawsze możliwe w .net core 1.0 z Microsoft.AspNetCore.Http.Extensions
, który dodaje rozszerzenie, HttpRequest
aby 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 .
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.
Możesz rozważyć użycie tej metody rozszerzenia (z Microsoft.AspNetCore.Http.Extensions
przestrzeni nazw:
@Context.Request.GetDisplayUrl()
W przypadku niektórych projektów preferuję bardziej elastyczne rozwiązania. Istnieją dwie metody rozszerzeń.
1) Pierwsza metoda tworzy Uri
obiekt z przychodzących danych żądania (z niektórymi wariantami poprzez opcjonalne parametry). 2) Druga metoda odbiera Uri
obiekt i zwraca string
w 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¶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
? To nie zadziała Microsoft.AspNetCore.Http.HttpContext.Request
Jeśli chcesz również uzyskać numer portu z żądania, musisz uzyskać do niego dostęp za pośrednictwem Request.Host
właściwości dla AspNet Core.
Request.Host
Nieruchomość 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.Host
daje 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.Host
Lub Request.Host.Port
).
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:
@Context.Request.PathBase@Context.Request.GetEncodedPathAndQuery()
@using Microsoft.AspNetCore.Http.Extensions
Aby metoda GetEncodedPathAndQuery () była dostępna, musisz dodać widok.
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.