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ó?
@HttpContextthay 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.Extensionssau đó@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.Extensionskhô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.Hosttính dành cho AspNet Core.
Các Request.Hostbấ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.Hostsẽ 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.Hosthoặ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.Extensionsvà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.