Di versi asp.net sebelumnya, kami dapat menggunakan
@Request.Url.AbsoluteUri
Tapi sepertinya sudah berubah. Bagaimana kita bisa melakukannya di asp.net core 1.0?
Di versi asp.net sebelumnya, kami dapat menggunakan
@Request.Url.AbsoluteUri
Tapi sepertinya sudah berubah. Bagaimana kita bisa melakukannya di asp.net core 1.0?
Jawaban:
Anda harus mendapatkan host dan jalur secara terpisah.
@Context.Request.Host@Context.Request.Path
@
antara dua senar? bisakah kamu menjelaskannya?
@HttpContext
sebagai gantinya @Context
. Untuk tampilan parsial @Context
bekerja. Apakah saya lupa menggunakan?
Url.Action("Action", null, null, Request.Url.Scheme);
stackoverflow.com/questions/434604/…
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}")
Anda dapat menggunakan metode ekstensi Request
:
Request.GetDisplayUrl()
@using Microsoft.AspNetCore.Http.Extensions
kemudian@Context.Request.GetDisplayUrl()
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).
Ini tampaknya selalu mungkin dalam .net core 1.0 dengan Microsoft.AspNetCore.Http.Extensions
, yang menambahkan ekstensi HttpRequest
untuk 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 .
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.
Anda dapat mempertimbangkan untuk menggunakan metode ekstensi ini (dari Microsoft.AspNetCore.Http.Extensions
namespace:
@Context.Request.GetDisplayUrl()
Untuk beberapa proyek saya, saya lebih memilih solusi yang lebih fleksibel. Ada dua metode ekstensi.
1) Metode pertama membuat Uri
objek dari data permintaan yang masuk (dengan beberapa varian melalui parameter opsional). 2) Metode kedua menerima Uri
objek dan mengembalikan string
dalam 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¶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
? Itu tidak akan berhasil dengan Microsoft.AspNetCore.Http.HttpContext.Request
Jika Anda juga ingin mendapatkan nomor port dari permintaan tersebut, Anda harus mengaksesnya melalui Request.Host
properti untuk AspNet Core.
The Request.Host
properti 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.Host
akan 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.Host
atau Request.Host.Port
).
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:
@Context.Request.PathBase@Context.Request.GetEncodedPathAndQuery()
Dan Anda perlu menambahkan @using Microsoft.AspNetCore.Http.Extensions
tampilan agar metode GetEncodedPathAndQuery () tersedia.
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.