Asp.net'in önceki sürümlerinde kullanabiliyorduk
@Request.Url.AbsoluteUri
Ama değişmiş gibi görünüyor. Bunu asp.net core 1.0'da nasıl yapabiliriz?
Asp.net'in önceki sürümlerinde kullanabiliyorduk
@Request.Url.AbsoluteUri
Ama değişmiş gibi görünüyor. Bunu asp.net core 1.0'da nasıl yapabiliriz?
Yanıtlar:
Ana bilgisayarı ve yolu ayrı ayrı almanız gerekir.
@Context.Request.Host@Context.Request.Path
@
İki tel arasındaki bu nedir ? açıklar mısın
@HttpContext
bunun yerine kullanmak zorunda kaldım @Context
. Kısmi görünümler için @Context
çalışır. Bir kullanımı unuttum mu?
Url.Action("Action", null, null, Request.Url.Scheme);
stackoverflow.com/questions/434604/… 'de
Şema, ana bilgisayar, yol ve queryString'e ihtiyacınız var
@string.Format("{0}://{1}{2}{3}", Context.Request.Scheme, Context.Request.Host, Context.Request.Path, Context.Request.QueryString)
veya yeni C # 6 özelliği "Dize enterpolasyonu" kullanarak
@($"{Context.Request.Scheme}://{Context.Request.Host}{Context.Request.Path}{Context.Request.QueryString}")
Şu uzantı yöntemini kullanabilirsiniz Request
:
Request.GetDisplayUrl()
@using Microsoft.AspNetCore.Http.Extensions
sonra@Context.Request.GetDisplayUrl()
Suitable only for display. This format should not be used in HTTP headers or other HTTP operations.
Buna dayanarak, @ tmg'nin çözümünün en iyisi olduğunu düşünüyorum (belki de kendi genişletme yönteminize sarılmış).
Bu, tam URL'yi elde Microsoft.AspNetCore.Http.Extensions
etmek HttpRequest
için uzantı ekleyen .net core 1.0'da her zaman mümkündü ; GetEncodedUrl .
örneğin, ustura görünümünden:
@using Microsoft.AspNetCore.Http.Extensions
...
<a href="@Context.Request.GetEncodedUrl()">Link to myself</a>
2.0'dan beri, göreli yol ve GetEncodedPathAndQuery sorgusu da var .
URI'nın AbsoluteUri özelliğini kullanın, .Net çekirdeği ile bu gibi bir istekten Uri oluşturmalısınız,
var location = new Uri($"{Request.Scheme}://{Request.Host}{Request.Path}{Request.QueryString}");
var url = location.AbsoluteUri;
örneğin, istek url'si ' http://www.contoso.com/catalog/shownew.htm?date=today ' ise, bu aynı url'yi döndürecektir.
Bu uzantı yöntemini kullanmayı düşünebilirsiniz ( Microsoft.AspNetCore.Http.Extensions
ad alanından:
@Context.Request.GetDisplayUrl()
Bazı projelerim için daha esnek çözümü tercih ediyorum. İki uzatma yöntemi vardır.
1) İlk yöntem, Uri
gelen istek verilerinden (isteğe bağlı parametreler aracılığıyla bazı değişkenlerle) nesne oluşturur . 2) İkinci yöntem Uri
nesneyi alır ve string
aşağıdaki formatta geri döner (sonda eğik çizgi olmadan): 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);
}
Kullanım:
//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
? Bu işe yaramayacak Microsoft.AspNetCore.Http.HttpContext.Request
Bağlantı noktası numarasını da istekten almak istiyorsanız , bağlantı noktası numarasınıRequest.Host
AspNet Core özelliği .
Request.Host
Mülkiyet, bunun yerine, konak hem alanını tutan bir nesne sadece bir dize değil ama ve port numarasını. Port numarası spesifik ise dışarı yazılı URL'ye (yani içinde "https://example.com:8080/path/to/resource"
), sonra arayarakRequest.Host
size konak alanını ve şöyle port numarasını verecektir: "example.com:8080"
.
Yalnızca ana makine etki alanının değerini istiyorsanız veya yalnızca bağlantı noktası numarası değerini istiyorsanız, bu özelliklere ayrı ayrı erişebilirsiniz (yani Request.Host.Host
veya Request.Host.Port
).
Kabul edilen cevap, @padigan'dan gelen yorum gibi bana yardımcı oldu, ancak benim için olduğu gibi sorgu dizesi parametrelerini dahil etmek istiyorsanız, şunu deneyin:
@Context.Request.PathBase@Context.Request.GetEncodedPathAndQuery()
@using Microsoft.AspNetCore.Http.Extensions
GetEncodedPathAndQuery () yönteminin kullanılabilir olması için görünüme eklemeniz gerekir .
Bir Razor sayfasından veya PageModel sınıfından geçerli URL'yi almanın temiz bir yolu vardır. Yani:
Url.PageLink()
Lütfen MVC'yi değil, "ASP.NET Core Razor Pages " ı kastettiğimi unutmayın .
Bu yöntemi ASP.NET Core jilet sayfalarında canonical URL meta etiketini yazdırmak istediğimde kullanıyorum. Ama bir sorun var. Size o sayfa için doğru URL olması gereken URL'yi verecektir. Açıklamama izin ver.
Diyelim ki sayfanız için "id" adında bir yol tanımladınız ve bu nedenle URL'niz şöyle görünmelidir
http://example.com/product?id=34
Url.PageLink () size yukarıda gösterildiği gibi tam olarak bu URL'yi verecektir.
Şimdi, kullanıcı bu URL'ye fazladan bir şey eklerse, diyelim ki
http://example.com/product?id=34&somethingElse
O zaman, bu yöntemden "bir şey" alamayacaksınız. Ve bu nedenle, HTML sayfasında kanonik URL meta etiketi yazdırmak için tam olarak iyidir.