Dans les versions précédentes d'asp.net, nous pourrions utiliser
@Request.Url.AbsoluteUri
Mais il semble que cela ait changé. Comment pouvons-nous faire cela dans asp.net core 1.0?
Dans les versions précédentes d'asp.net, nous pourrions utiliser
@Request.Url.AbsoluteUri
Mais il semble que cela ait changé. Comment pouvons-nous faire cela dans asp.net core 1.0?
Réponses:
Vous devez obtenir l'hôte et le chemin séparément.
@Context.Request.Host@Context.Request.Path
@
entre les deux chaînes? pouvez-vous l'expliquer?
@HttpContext
place @Context
. Pour les vues partielles @Context
fonctionne. Ai-je oublié une utilisation?
Url.Action("Action", null, null, Request.Url.Scheme);
stackoverflow.com/questions/434604/…
Vous avez besoin d'un schéma, d'un hôte, d'un chemin et d'une chaîne de requête
@string.Format("{0}://{1}{2}{3}", Context.Request.Scheme, Context.Request.Host, Context.Request.Path, Context.Request.QueryString)
ou en utilisant la nouvelle fonctionnalité C # 6 "Interpolation de chaîne"
@($"{Context.Request.Scheme}://{Context.Request.Host}{Context.Request.Path}{Context.Request.QueryString}")
Vous pouvez utiliser la méthode d'extension de Request
:
Request.GetDisplayUrl()
@using Microsoft.AspNetCore.Http.Extensions
ensuite@Context.Request.GetDisplayUrl()
Suitable only for display. This format should not be used in HTTP headers or other HTTP operations.
Sur cette base, je pense que la solution de @ tmg est la meilleure (peut-être enveloppée dans votre propre méthode d'extension).
C'était apparemment toujours possible dans .net core 1.0 avec Microsoft.AspNetCore.Http.Extensions
, qui ajoute une extension HttpRequest
pour obtenir l'URL complète; GetEncodedUrl .
par exemple de la vue rasoir:
@using Microsoft.AspNetCore.Http.Extensions
...
<a href="@Context.Request.GetEncodedUrl()">Link to myself</a>
Depuis 2.0, ont également un chemin relatif et une requête GetEncodedPathAndQuery .
Utilisez la propriété AbsoluteUri de l'URI, avec .Net core, vous devez créer l'URI à partir d'une requête comme celle-ci,
var location = new Uri($"{Request.Scheme}://{Request.Host}{Request.Path}{Request.QueryString}");
var url = location.AbsoluteUri;
Par exemple, si l'url de la requête est « http://www.contoso.com/catalog/shownew.htm?date=today », cela renverra la même URL.
Vous pouvez envisager d'utiliser cette méthode d'extension (depuis l' Microsoft.AspNetCore.Http.Extensions
espace de noms:
@Context.Request.GetDisplayUrl()
Pour certains de mes projets, je préfère une solution plus flexible. Il existe deux méthodes d'extensions.
1) La première méthode crée un Uri
objet à partir des données de demande entrantes (avec certaines variantes via des paramètres facultatifs). 2) La deuxième méthode reçoit l' Uri
objet et renvoie string
au format suivant (sans barre oblique à la fin): 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);
}
Usage:
//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
? Cela ne fonctionnera pas avec Microsoft.AspNetCore.Http.HttpContext.Request
Si vous souhaitez également obtenir le numéro de port de la demande, vous devrez y accéder via leRequest.Host
propriété pour AspNet Core.
La Request.Host
propriété n'est pas simplement une chaîne, mais plutôt un objet qui contient à la fois le domaine hôte et le numéro de port. Si le numéro de port est spécifiquement écrit sur l'URL ( par exemple "https://example.com:8080/path/to/resource"
), puis en appelant Request.Host
vous donnera le domaine hôte et le numéro de port comme ceci: "example.com:8080"
.
Si vous souhaitez uniquement la valeur du domaine hôte ou uniquement la valeur du numéro de port, vous pouvez accéder à ces propriétés individuellement (c'est Request.Host.Host
-à- dire ou Request.Host.Port
).
La réponse acceptée m'a aidé, tout comme le commentaire de @padigan, mais si vous souhaitez inclure les paramètres de chaîne de requête comme c'était le cas pour moi, essayez ceci:
@Context.Request.PathBase@Context.Request.GetEncodedPathAndQuery()
Et vous devrez ajouter @using Microsoft.AspNetCore.Http.Extensions
la vue pour que la méthode GetEncodedPathAndQuery () soit disponible.
Il existe un moyen simple d'obtenir l'URL actuelle à partir d'une page Razor ou d'une classe PageModel. C'est:
Url.PageLink()
Veuillez noter que je voulais dire, les « Pages Razor ASP.NET Core ", pas le MVC.
J'utilise cette méthode lorsque je souhaite imprimer la balise meta d'URL canonique dans les pages de rasoir ASP.NET Core. Mais il ya un hic. Il vous donnera l'URL qui est censée être la bonne URL pour cette page. Laisse-moi expliquer.
Supposons que vous ayez défini un itinéraire nommé "id" pour votre page et que, par conséquent, votre URL devrait ressembler à
http://example.com/product?id=34
Le Url.PageLink () vous donnera exactement cette URL comme indiqué ci-dessus.
Maintenant, si l'utilisateur ajoute quelque chose de plus sur cette URL, disons,
http://example.com/product?id=34&somethingElse
Ensuite, vous n'obtiendrez pas ce "somethingElse" de cette méthode. Et c'est pourquoi il est parfait pour imprimer la balise meta d'URL canonique dans la page HTML.