Trong các phiên bản trước của asp.net, chúng ta có thể sử dụng
@Request.Url.AbsoluteUri
Nhưng có vẻ như nó đã thay đổi. Làm thế nào chúng ta có thể làm điều đó trong asp.net core 1.0?
Trong các phiên bản trước của asp.net, chúng ta có thể sử dụng
@Request.Url.AbsoluteUri
Nhưng có vẻ như nó đã thay đổi. Làm thế nào chúng ta có thể làm điều đó trong asp.net core 1.0?
Câu trả lời:
Bạn phải lấy máy chủ và đường dẫn riêng biệt.
@Context.Request.Host@Context.Request.Path
@
giữa hai chuỗi? bạn có thể giải thích nó?
@HttpContext
thay thế @Context
. Đối với các chế độ xem từng phần @Context
. Tôi đã quên một sử dụng?
Url.Action("Action", null, null, Request.Url.Scheme);
stackoverflow.com/questions/434604/…
Bạn cần lược đồ, máy chủ lưu trữ, đường dẫn và chuỗi truy vấn
@string.Format("{0}://{1}{2}{3}", Context.Request.Scheme, Context.Request.Host, Context.Request.Path, Context.Request.QueryString)
hoặc sử dụng tính năng C # 6 mới "Nội suy chuỗi"
@($"{Context.Request.Scheme}://{Context.Request.Host}{Context.Request.Path}{Context.Request.QueryString}")
Bạn có thể sử dụng phương thức mở rộng của Request
:
Request.GetDisplayUrl()
@using Microsoft.AspNetCore.Http.Extensions
sau đó@Context.Request.GetDisplayUrl()
Suitable only for display. This format should not be used in HTTP headers or other HTTP operations.
Dựa trên điều này, tôi nghĩ giải pháp của @ tmg là tốt nhất (có lẽ được gói trong phương pháp mở rộng của riêng bạn).
Điều này dường như luôn có thể thực hiện được trong .net core 1.0 Microsoft.AspNetCore.Http.Extensions
, có thêm phần mở rộng HttpRequest
để có được URL đầy đủ; GetEncodedUrl .
ví dụ từ chế độ xem dao cạo:
@using Microsoft.AspNetCore.Http.Extensions
...
<a href="@Context.Request.GetEncodedUrl()">Link to myself</a>
Kể từ 2.0, cũng có đường dẫn tương đối và truy vấn GetEncodedPathAndQuery .
Sử dụng thuộc tính AbsoluteUri của Uri, với lõi .Net, bạn phải tạo Uri từ yêu cầu như thế này,
var location = new Uri($"{Request.Scheme}://{Request.Host}{Request.Path}{Request.QueryString}");
var url = location.AbsoluteUri;
ví dụ: nếu url yêu cầu là ' http://www.contoso.com/catalog/shownew.htm?date=today ', điều này sẽ trả về cùng một url.
Bạn có thể cân nhắc sử dụng phương pháp mở rộng này (từ Microsoft.AspNetCore.Http.Extensions
không gian tên:
@Context.Request.GetDisplayUrl()
Đối với một số dự án của tôi, tôi thích giải pháp linh hoạt hơn. Có hai phương pháp mở rộng.
1) Phương thức đầu tiên tạo Uri
đối tượng từ dữ liệu yêu cầu đến (với một số biến thể thông qua các tham số tùy chọn). 2) Phương thức thứ hai nhận Uri
đối tượng và trả về string
ở định dạng sau (không có dấu gạch chéo): 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);
}
Sử dụng:
//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
đâu? Đó không phải là sẽ làm việc với Microsoft.AspNetCore.Http.HttpContext.Request
Nếu bạn cũng đang muốn lấy số cổng ra khỏi yêu cầu, bạn sẽ cần truy cập nó thông qua thuộc Request.Host
tính dành cho AspNet Core.
Các Request.Host
bất động sản không chỉ đơn giản là một chuỗi nhưng, thay vào đó, một đối tượng chứa cả hai lĩnh vực máy chủ và số cổng. Nếu số cổng được đặc biệt viết ra trong URL (ví dụ "https://example.com:8080/path/to/resource"
), sau đó gọi Request.Host
sẽ cung cấp cho bạn các miền máy chủ và số cổng như vậy: "example.com:8080"
.
Nếu bạn chỉ muốn giá trị cho miền máy chủ hoặc chỉ muốn giá trị cho số cổng thì bạn có thể truy cập các thuộc tính đó riêng lẻ (tức là Request.Host.Host
hoặc Request.Host.Port
).
Câu trả lời được chấp nhận đã giúp tôi, cũng như nhận xét từ @padigan nhưng nếu bạn muốn bao gồm các tham số chuỗi truy vấn như trường hợp của tôi thì hãy thử điều này:
@Context.Request.PathBase@Context.Request.GetEncodedPathAndQuery()
Và bạn sẽ cần thêm @using Microsoft.AspNetCore.Http.Extensions
vào dạng xem để phương thức GetEncodedPathAndQuery () khả dụng.
Có một cách rõ ràng để lấy URL hiện tại từ trang Razor hoặc lớp PageModel. Đó là:
Url.PageLink()
Xin lưu ý rằng ý của tôi là "Trang dao cạo lõi ASP.NET", không phải MVC.
Tôi sử dụng phương pháp này khi tôi muốn in thẻ meta URL chuẩn trong các trang dao cạo ASP.NET Core. Nhưng có một nhược điểm. Nó sẽ cung cấp cho bạn URL được cho là URL phù hợp cho trang đó. Hãy để tôi giải thích.
Giả sử, theo lộ trình bạn đã xác định cho một trang, URL của bạn sẽ giống như
Giả sử, bạn đã xác định "Id" tuyến đường cho trang của mình. Vì vậy, Url.PageLink () sẽ cung cấp cho bạn chính xác URL đó. Nếu người dùng thêm bất cứ điều gì bổ sung trên URL đó, hãy nói,
Sau đó, bạn sẽ không nhận được "somethingElse" từ phương thức này. Và đó là lý do tại sao nó chính xác tốt cho việc in thẻ meta URL chuẩn trong trang HTML.