Cara mendapatkan url saat ini dalam tampilan di asp.net core 1.0

Jawaban:

122

Anda harus mendapatkan host dan jalur secara terpisah.

 @[email protected]
Clint B
sumber
14
Ini tidak akan melaporkan url yang benar jika aplikasi Anda berada di direktori virtual. Anda harus mengawali nilai Request.Path dengan nilai Request.PathBase jika ada. Ini juga berlaku untuk hampir semua jawaban lain atas pertanyaan ini.
padigan
Apa ini di @antara dua senar? bisakah kamu menjelaskannya?
Mohammed Noureldin
3
@MohammedNoureldin: itu adalah sintaks tampilan pisau cukur.
jack.pop
2
Untuk halaman pisau cukur saya harus menggunakan @HttpContextsebagai gantinya @Context. Untuk tampilan parsial @Contextbekerja. Apakah saya lupa menggunakan?
Andriod
2
Ada cara mudah di MVC Url.Action("Action", null, null, Request.Url.Scheme); stackoverflow.com/questions/434604/…
Dan
110

Anda membutuhkan skema, host, jalur, dan queryString

@string.Format("{0}://{1}{2}{3}", Context.Request.Scheme, Context.Request.Host, Context.Request.Path, Context.Request.QueryString)

atau menggunakan fitur C # 6 baru "Interpolasi string"

@($"{Context.Request.Scheme}://{Context.Request.Host}{Context.Request.Path}{Context.Request.QueryString}")
tmg
sumber
1
Bagaimana Anda mendapatkan fragmen, katakan test.com/abc#123 , bagaimana Anda mendapatkan fragmen # 123 dari permintaan?
Ray
4
@fanray Anda tidak bisa. Browser tidak mengirimkan fragmen URI ke server
tmg
Pertimbangkan untuk menggunakan UriBuilder untuk membuat url.
Erik Philips
84

Anda dapat menggunakan metode ekstensi Request:

Request.GetDisplayUrl()
AlexBar
sumber
33
Ini berfungsi jika Anda menambahkan @using Microsoft.AspNetCore.Http.Extensionskemudian@Context.Request.GetDisplayUrl()
Serj Sagan
2
masih mendapatkan - Permintaan tidak ada dalam konteks saat ini
SeanMC
1
Ingatlah ringkasan intellisense untuk fungsi ini mengatakan Suitable only for display. This format should not be used in HTTP headers or other HTTP operations.Berdasarkan ini, saya pikir solusi @ tmg adalah yang terbaik (mungkin dibungkus dengan metode ekstensi Anda sendiri).
Gordon Glas
16

Ini tampaknya selalu mungkin dalam .net core 1.0 dengan Microsoft.AspNetCore.Http.Extensions, yang menambahkan ekstensi HttpRequestuntuk mendapatkan URL lengkap; GetEncodedUrl .

mis. dari pandangan pisau cukur:

@using Microsoft.AspNetCore.Http.Extensions
...
<a href="@Context.Request.GetEncodedUrl()">Link to myself</a>

Sejak 2.0, juga memiliki jalur relatif dan kueri GetEncodedPathAndQuery .

mcNux
sumber
15

Gunakan properti AbsoluteUri dari Uri, dengan inti .Net Anda harus membangun Uri dari permintaan seperti ini,

 var location = new Uri($"{Request.Scheme}://{Request.Host}{Request.Path}{Request.QueryString}");

 var url = location.AbsoluteUri;

misal, jika url permintaan adalah ' http://www.contoso.com/catalog/shownew.htm?date=today ' ini akan mengembalikan url yang sama.

Dhanuka777
sumber
8
Hal-hal seperti ini membuat saya berpikir .Net Core adalah langkah mundur dalam beberapa hal. Apakah ini lebih baik daripada Request.Url di Asp.Net dalam beberapa hal yang tidak dapat saya bayangkan?
Soenhay
8

Anda dapat mempertimbangkan untuk menggunakan metode ekstensi ini (dari Microsoft.AspNetCore.Http.Extensionsnamespace:

@Context.Request.GetDisplayUrl()

Untuk beberapa proyek saya, saya lebih memilih solusi yang lebih fleksibel. Ada dua metode ekstensi.

1) Metode pertama membuat Uriobjek dari data permintaan yang masuk (dengan beberapa varian melalui parameter opsional). 2) Metode kedua menerima Uriobjek dan mengembalikan stringdalam format berikut (tanpa garis miring): 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);
    }

Pemakaian:

//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
pengguna3172616
sumber
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);
}
Sergey
sumber
tapi dimana kamu mendapatkan httpContext? Itu tidak akan berhasil dengan Microsoft.AspNetCore.Http.HttpContext.Request
Tom Stickel
7

Jika Anda juga ingin mendapatkan nomor port dari permintaan tersebut, Anda harus mengaksesnya melalui Request.Hostproperti untuk AspNet Core.

The Request.Hostproperti tidak hanya string tetapi, sebaliknya, sebuah benda yang memegang kedua host domain dan nomor port. Jika nomor port khusus ditulis dalam URL (yaitu "https://example.com:8080/path/to/resource"), kemudian memanggil Request.Hostakan memberikan domain host dan nomor port seperti: "example.com:8080".

Jika Anda hanya menginginkan nilai untuk domain host atau hanya menginginkan nilai untuk nomor port, maka Anda dapat mengakses properti tersebut satu per satu (yaitu Request.Host.Hostatau Request.Host.Port).

Hallmanac
sumber
6

Jawaban yang diterima membantu saya, seperti halnya komentar untuk itu dari @padigan tetapi jika Anda ingin menyertakan parameter kueri-string seperti yang terjadi pada saya, coba ini:

@[email protected]()

Dan Anda perlu menambahkan @using Microsoft.AspNetCore.Http.Extensionstampilan agar metode GetEncodedPathAndQuery () tersedia.

Christopher King
sumber
1

Ada cara yang bersih untuk mendapatkan URL saat ini dari halaman Razor atau kelas PageModel. Itu adalah:

Url.PageLink()

Harap dicatat bahwa yang saya maksud, "ASP.NET Core Razor Pages ", bukan MVC.

Saya menggunakan metode ini ketika saya ingin mencetak meta tag URL kanonik di halaman pisau cukur ASP.NET Core. Tapi ada tangkapan. Ini akan memberi Anda URL yang seharusnya menjadi URL yang tepat untuk halaman itu. Biar saya jelaskan.

Misalnya, Anda telah menentukan rute bernama "id" untuk halaman Anda dan oleh karena itu, URL Anda akan terlihat seperti ini

http://example.com/product?id=34

Url.PageLink () akan memberi Anda URL persis seperti yang ditunjukkan di atas.

Sekarang, jika pengguna menambahkan sesuatu yang ekstra pada URL itu, katakanlah,

http://example.com/product?id=34&somethingElse

Kemudian, Anda tidak akan mendapatkan "sesuatu yang lain" dari metode ini. Dan itulah mengapa sangat bagus untuk mencetak meta tag URL kanonik di halaman HTML.

Emran Hussain
sumber