Nelle versioni precedenti di asp.net, potremmo usare
@Request.Url.AbsoluteUri
Ma sembra che sia cambiato. Come possiamo farlo in asp.net core 1.0?
Nelle versioni precedenti di asp.net, potremmo usare
@Request.Url.AbsoluteUri
Ma sembra che sia cambiato. Come possiamo farlo in asp.net core 1.0?
Risposte:
Devi ottenere l'host e il percorso separatamente.
@Context.Request.Host@Context.Request.Path
@
tra le due corde? potresti spiegarlo?
@HttpContext
posto di @Context
. Per le viste parziali @Context
funziona. Ho dimenticato un utilizzo?
Url.Action("Action", null, null, Request.Url.Scheme);
stackoverflow.com/questions/434604/…
Hai bisogno di schema, host, percorso e queryString
@string.Format("{0}://{1}{2}{3}", Context.Request.Scheme, Context.Request.Host, Context.Request.Path, Context.Request.QueryString)
o utilizzando la nuova funzionalità C # 6 "Interpolazione di stringhe"
@($"{Context.Request.Scheme}://{Context.Request.Host}{Context.Request.Path}{Context.Request.QueryString}")
Puoi utilizzare il metodo di estensione di Request
:
Request.GetDisplayUrl()
@using Microsoft.AspNetCore.Http.Extensions
poi@Context.Request.GetDisplayUrl()
Suitable only for display. This format should not be used in HTTP headers or other HTTP operations.
Basandomi su questo, penso che la soluzione di @ tmg sia la migliore (forse racchiusa nel tuo metodo di estensione).
Apparentemente questo era sempre possibile in .net core 1.0 con Microsoft.AspNetCore.Http.Extensions
, che aggiunge l'estensione HttpRequest
per ottenere l'URL completo; GetEncodedUrl .
ad es. dalla vista rasoio:
@using Microsoft.AspNetCore.Http.Extensions
...
<a href="@Context.Request.GetEncodedUrl()">Link to myself</a>
Dalla 2.0, hanno anche percorso relativo e query GetEncodedPathAndQuery .
Usa la proprietà AbsoluteUri di Uri, con .Net core devi creare Uri da una richiesta come questa,
var location = new Uri($"{Request.Scheme}://{Request.Host}{Request.Path}{Request.QueryString}");
var url = location.AbsoluteUri;
ad esempio, se l'URL della richiesta è " http://www.contoso.com/catalog/shownew.htm?date=today ", verrà restituito lo stesso URL.
Puoi considerare di utilizzare questo metodo di estensione (dallo Microsoft.AspNetCore.Http.Extensions
spazio dei nomi:
@Context.Request.GetDisplayUrl()
Per alcuni miei progetti preferisco soluzioni più flessibili. Esistono due metodi di estensione.
1) Il primo metodo crea l' Uri
oggetto dai dati della richiesta in arrivo (con alcune varianti tramite parametri opzionali). 2) Il secondo metodo riceve l' Uri
oggetto e restituisce string
nel seguente formato (senza barra finale): 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);
}
Utilizzo:
//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
? Non funzionerà con Microsoft.AspNetCore.Http.HttpContext.Request
Se stai cercando di ottenere anche il numero di porta dalla richiesta, dovrai accedervi tramite la Request.Host
proprietà per AspNet Core.
La Request.Host
proprietà non è semplicemente una stringa ma, invece, un oggetto che contiene sia il dominio host che il numero di porta. Se il numero di porta è specificamente scritto fuori nella URL (es "https://example.com:8080/path/to/resource"
), quindi chiamando Request.Host
vi darà il dominio host e il numero di porta in questo modo: "example.com:8080"
.
Se si desidera solo il valore per il dominio host o si desidera solo il valore per il numero di porta, è possibile accedere a tali proprietà singolarmente (ad esempio Request.Host.Host
o Request.Host.Port
).
La risposta accettata mi ha aiutato, così come il commento di @padigan, ma se vuoi includere i parametri della stringa di query come è stato per me, prova questo:
@Context.Request.PathBase@Context.Request.GetEncodedPathAndQuery()
E sarà necessario aggiungere @using Microsoft.AspNetCore.Http.Extensions
nella vista affinché il metodo GetEncodedPathAndQuery () sia disponibile.
Esiste un modo semplice per ottenere l'URL corrente da una pagina Razor o da una classe PageModel. Questo è:
Url.PageLink()
Si noti che intendevo "ASP.NET Core Razor Pages ", non MVC.
Uso questo metodo quando voglio stampare il meta tag dell'URL canonico nelle pagine Razor di ASP.NET Core. Ma c'è un problema. Ti darà l'URL che dovrebbe essere l'URL giusto per quella pagina. Lasciatemi spiegare.
Supponiamo che tu abbia definito una rotta denominata "id" per la tua pagina e quindi il tuo URL dovrebbe apparire come
http://example.com/product?id=34
Url.PageLink () ti darà esattamente quell'URL come mostrato sopra.
Ora, se l'utente aggiunge qualcosa in più a quell'URL, ad esempio,
http://example.com/product?id=34&somethingElse
Quindi, non otterrai quel "somethingElse" da questo metodo. Ed è per questo che è esattamente buono per la stampa di meta tag URL canonici nella pagina HTML.