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ć?
@HttpContextzamiast @Context. W przypadku widoków częściowych @Contextdział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.Extensionswtedy@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, 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 .
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.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¶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.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).
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.ExtensionsAby 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.