Cách lấy url hiện tại trong chế độ xem trong asp.net core 1.0


102

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?



6
@DavidG Có vẻ như bây giờ bạn có thể sử dụng UriHelper.GetDisplayUrl (Re‌ quest)
Mark G

Câu trả lời:


120

Bạn phải lấy máy chủ và đường dẫn riêng biệt.

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

14
Điều này sẽ không báo cáo đúng url nếu ứng dụng của bạn đang ở trong một thư mục ảo. Bạn sẽ cần phải đặt trước giá trị Request.Path với giá trị Request.PathBase nếu có. Điều này cũng áp dụng cho hầu hết các câu trả lời khác cho câu hỏi này.
padigan

Đây là gì @giữa hai chuỗi? bạn có thể giải thích nó?
Mohammed Noureldin

3
@MohammedNoureldin: đó là cú pháp xem dao cạo.
jack.pop

2
Đối với các trang dao cạo, tôi đã phải sử dụng @HttpContextthay thế @Context. Đối với các chế độ xem từng phần @Context. Tôi đã quên một sử dụng?
Andriod

2
Có một cách dễ dàng trong MVC Url.Action("Action", null, null, Request.Url.Scheme); stackoverflow.com/questions/434604/…
Dan

110

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

1
Làm cách nào để lấy phân đoạn, giả sử test.com/abc#123 , làm cách nào để lấy phân đoạn # 123 từ yêu cầu?
Ray

4
@fanray Bạn không thể. Các trình duyệt không gửi các phân đoạn URI đến máy chủ
tmg

Cân nhắc sử dụng UriBuilder để tạo url.
Erik Philips

84

Bạn có thể sử dụng phương thức mở rộng của Request:

Request.GetDisplayUrl()

33
Đây hoạt động nếu bạn thêm @using Microsoft.AspNetCore.Http.Extensionssau đó@Context.Request.GetDisplayUrl()
Serj Sagan

2
vẫn nhận được - Yêu cầu không tồn tại trong bối cảnh hiện tại
SeanMC

1
Hãy nhớ phần tóm tắt intellisense cho hàm này cho biết 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).
Gordon Glas,

16

Đ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 .


15

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.


8
Những thứ như thế này khiến tôi nghĩ .Net Core là một bước lùi về một số mặt. Điều này có tốt hơn Request.Url trong Asp.Net theo một cách nào đó mà tôi không thể tưởng tượng được không?
Soenhay 21/02/18

8

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

nhưng bạn đang nhận được ở httpContextđâu? Đó không phải là sẽ làm việc với Microsoft.AspNetCore.Http.HttpContext.Request
Tom Stickel

7

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ủ 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).


6

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.


1

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ư

http://www.myWebsite.com/product?id=34

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,

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

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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.