In früheren Versionen von asp.net konnten wir verwenden
@Request.Url.AbsoluteUri
Aber es scheint sich geändert zu haben. Wie können wir das in asp.net Core 1.0 tun?
In früheren Versionen von asp.net konnten wir verwenden
@Request.Url.AbsoluteUri
Aber es scheint sich geändert zu haben. Wie können wir das in asp.net Core 1.0 tun?
Antworten:
Sie müssen den Host und den Pfad separat abrufen.
@Context.Request.Host@Context.Request.Path
@
zwischen den beiden Saiten? Könntest du es erklären?
@HttpContext
stattdessen verwenden @Context
. Für Teilansichten @Context
funktioniert. Habe ich eine Verwendung vergessen?
Url.Action("Action", null, null, Request.Url.Scheme);
stackoverflow.com/questions/434604/…
Sie benötigen Schema, Host, Pfad und queryString
@string.Format("{0}://{1}{2}{3}", Context.Request.Scheme, Context.Request.Host, Context.Request.Path, Context.Request.QueryString)
oder mit der neuen C # 6-Funktion "String-Interpolation"
@($"{Context.Request.Scheme}://{Context.Request.Host}{Context.Request.Path}{Context.Request.QueryString}")
Sie können die Erweiterungsmethode verwenden von Request
:
Request.GetDisplayUrl()
@using Microsoft.AspNetCore.Http.Extensions
dann hinzufügen@Context.Request.GetDisplayUrl()
Suitable only for display. This format should not be used in HTTP headers or other HTTP operations.
Folgendes angegeben ist. Auf dieser Grundlage halte ich die Lösung von @ tmg für die beste (möglicherweise in Ihre eigene Erweiterungsmethode eingeschlossen).
Dies war anscheinend in .net Core 1.0 mit immer möglich Microsoft.AspNetCore.Http.Extensions
, wodurch eine Erweiterung hinzugefügt wird HttpRequest
, um die vollständige URL zu erhalten. GetEncodedUrl .
zB aus der Sicht des Rasiermessers:
@using Microsoft.AspNetCore.Http.Extensions
...
<a href="@Context.Request.GetEncodedUrl()">Link to myself</a>
Haben Sie seit 2.0 auch relativen Pfad und Abfrage GetEncodedPathAndQuery .
Verwenden Sie die AbsoluteUri- Eigenschaft des Uri. Mit dem .Net-Kern müssen Sie den Uri aus einer solchen Anforderung erstellen.
var location = new Uri($"{Request.Scheme}://{Request.Host}{Request.Path}{Request.QueryString}");
var url = location.AbsoluteUri;
Wenn die Anforderungs-URL beispielsweise " http://www.contoso.com/catalog/shownew.htm?date=today " lautet, wird dieselbe URL zurückgegeben.
Sie können diese Erweiterungsmethode in Betracht ziehen (aus dem Microsoft.AspNetCore.Http.Extensions
Namespace:
@Context.Request.GetDisplayUrl()
Für einige meiner Projekte bevorzuge ich eine flexiblere Lösung. Es gibt zwei Erweiterungsmethoden.
1) Die erste Methode erstellt ein Uri
Objekt aus eingehenden Anforderungsdaten (mit einigen Varianten über optionale Parameter). 2) Die zweite Methode empfängt ein Uri
Objekt und gibt es string
im folgenden Format zurück (ohne abschließenden Schrägstrich): 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);
}
Verwendung:
//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
? Das wird nicht funktionieren mit Microsoft.AspNetCore.Http.HttpContext.Request
Wenn Sie auch die Portnummer aus der Anfrage herausholen möchten, müssen Sie über dieRequest.Host
herausholen Eigenschaft für AspNet Core darauf zugreifen.
Die Request.Host
Eigenschaft ist nicht einfach eine Zeichenfolge, sondern ein Objekt, das sowohl die Hostdomäne als auch die Portnummer enthält. Wenn die Portnummer speziell ist geschrieben in der URL (dh "https://example.com:8080/path/to/resource"
), dann Aufruf Request.Host
gibt Ihnen die Host - Domäne und die Portnummer wie folgt: "example.com:8080"
.
Wenn Sie nur den Wert für die Hostdomäne oder nur den Wert für die Portnummer möchten, können Sie einzeln auf diese Eigenschaften zugreifen (dh Request.Host.Host
oder Request.Host.Port
).
Die akzeptierte Antwort hat mir geholfen, ebenso wie der Kommentar von @padigan, aber wenn Sie die Abfragezeichenfolgenparameter wie bei mir einschließen möchten, versuchen Sie Folgendes:
@Context.Request.PathBase@Context.Request.GetEncodedPathAndQuery()
@using Microsoft.AspNetCore.Http.Extensions
Außerdem müssen Sie die Ansicht hinzufügen , damit die Methode GetEncodedPathAndQuery () verfügbar ist.
Es gibt eine saubere Möglichkeit, die aktuelle URL von einer Razor-Seite oder einer PageModel-Klasse abzurufen. Das ist:
Url.PageLink()
Bitte beachten Sie, dass ich die "ASP.NET Core Razor Pages" meinte, nicht die MVC.
Ich verwende diese Methode, wenn ich das kanonische URL-Meta-Tag auf den ASP.NET Core-Rasierseiten drucken möchte. Aber es gibt einen Haken. Sie erhalten die URL, die die richtige URL für diese Seite sein soll. Lassen Sie mich erklären.
Angenommen, gemäß der Route, die Sie für eine Seite definiert haben, sollte Ihre URL so aussehen
Angenommen, Sie haben eine Route "ID" für Ihre Seite definiert. Url.PageLink () gibt Ihnen also genau diese URL. Wenn der Benutzer dieser URL zusätzliche Elemente hinzufügt, z.
Dann erhalten Sie mit dieser Methode nicht das "SomethingElse". Und deshalb eignet es sich genau zum Drucken von kanonischen URL-Meta-Tags auf der HTML-Seite.