Asp.net core 1.0 görünümünde mevcut url nasıl alınır


Yanıtlar:


122

Ana bilgisayarı ve yolu ayrı ayrı almanız gerekir.

 @Context.Request.Host@Context.Request.Path

14
Uygulamanız sanal bir dizinde oturuyorsa, bu doğru url'yi bildirmez. Varsa , Request.Path değerinin Request.PathBase değerinin önüne eklenmesi gerekir . Bu, bu soruya verilen hemen hemen tüm diğer cevaplar için de geçerlidir.
padigan

@İki tel arasındaki bu nedir ? açıklar mısın
Muhammed Nureldin

3
@MohammedNoureldin: Bu jilet görünümü sözdizimi.
jack.pop

2
Jilet sayfaları için @HttpContextbunun yerine kullanmak zorunda kaldım @Context. Kısmi görünümler için @Contextçalışır. Bir kullanımı unuttum mu?
Andriod

2
MVC Url.Action("Action", null, null, Request.Url.Scheme); stackoverflow.com/questions/434604/… 'de
Dan

110

Ş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}")

1
Test.com/abc#123 gibi parçayı nasıl elde edersiniz, # 123 parçasını istekten nasıl alırsınız?
Ray

4
@fanray Yapamazsınız. Tarayıcılar sunucuya URI parçalarını göndermiyor
tmg

Url'ler oluşturmak için UriBuilder kullanmayı düşünün .
Erik Philips

86

Şu uzantı yöntemini kullanabilirsiniz Request:

Request.GetDisplayUrl()

33
Eklemek bu işleri @using Microsoft.AspNetCore.Http.Extensionssonra@Context.Request.GetDisplayUrl()
Serj Sagan

2
hala
alınıyor

1
Bu işlevin akıllıca özetinin şunu söylediğini unutmayın: 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ış).
Gordon Glas

16

Bu, tam URL'yi elde Microsoft.AspNetCore.Http.Extensionsetmek HttpRequestiç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 .


15

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.


8
Bunun gibi şeyler bana .Net Core'un bazı yönlerden geriye doğru bir adım olduğunu düşündürüyor. Bu Asp.Net'teki Request.Url'den daha iyi bir şekilde hayal edemeyeceğim bir şekilde mi?
Soenhay

8

Bu uzantı yöntemini kullanmayı düşünebilirsiniz ( Microsoft.AspNetCore.Http.Extensionsad 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, Urigelen istek verilerinden (isteğe bağlı parametreler aracılığıyla bazı değişkenlerle) nesne oluşturur . 2) İkinci yöntem Urinesneyi alır ve stringaş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&param2=b
        Request.GetUri(addQuery: false);
        //after >> https://localhost:44304/information/about

        //before >> https://localhost:44304/information/about?param1=a&param2=b
        new Uri("https://localhost:44304/information/about?param1=a&param2=b").GetHostWithNoSlash();
        //after >> https://localhost:44304

7
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);
}

ama nereden alıyorsun httpContext? Bu işe yaramayacak Microsoft.AspNetCore.Http.HttpContext.Request
Tom Stickel

7

Bağlantı noktası numarasını da istekten almak istiyorsanız , bağlantı noktası numarasınıRequest.Host AspNet Core özelliği .

Request.HostMü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.Hostveya Request.Host.Port).


6

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.ExtensionsGetEncodedPathAndQuery () yönteminin kullanılabilir olması için görünüme eklemeniz gerekir .


2

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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.