Lấy trang System.Web.UI.P hiện tại từ HttpContext?


84

Đây thực sự là một câu hỏi gồm hai phần. Đầu tiên, HttpContext.Current có tương ứng với đối tượng System.UI.Page hiện tại không?

Và câu hỏi thứ hai, có thể liên quan đến câu hỏi đầu tiên, là tại sao tôi không thể sử dụng phần sau để xem liệu trang hiện tại có triển khai giao diện hay không:

private IWebBase FindWebBase()
{
    if (HttpContext.Current as IWebBase != null)
    {
        return (IWebBase)HttpContext.Current.;
    }
    throw new NotImplementedException("Crawling for IWebBase not implemented yet");
}

Bối cảnh chung là một số điều khiển cần biết liệu chúng đang thực thi dưới dạng phần mềm web SharePoint hay là một phần của khung Asp.Net.

Tôi đã giải quyết vấn đề bằng cách yêu cầu điều khiển chuyển một tham chiếu đến chính nó và kiểm tra thuộc tính Trang của điều khiển, nhưng tôi vẫn tò mò tại sao ở trên không hoạt động.

Lỗi trình biên dịch là: Không thể chuyển đổi System.Web.HttpContext thành ... IWebBase thông qua chuyển đổi tham chiếu, chuyển đổi quyền anh, chuyển đổi mở hộp, chuyển đổi gói hoặc chuyển đổi kiểu null.

Câu trả lời:


144

Không, từ MSDN trên HttpContext.Current: "Lấy hoặc đặt đối tượng HttpContext cho yêu cầu HTTP hiện tại."

Nói cách khác, nó là một đối tượng HttpContext, không phải là một Trang.

Bạn có thể truy cập đối tượng Trang thông qua HttpContext bằng cách sử dụng:

Page page = HttpContext.Current.Handler as Page;

if (page != null)
{
     // Use page instance.
}

2
Bỏ phiếu xuống vì không chính xác. Câu trả lời với HttpContext.Current.CurrentHandler là chính xác! Nếu bạn sử dụng Server.Transfer, HttpContext.Current.Handler SẼ LÀ TRANG TRƯỚC, HttpContext.Current.CurrentHandler SẼ LÀ TRANG HIỆN TẠI
mike

37

Bạn đang tìm kiếm HttpContext.Handler. Vì Trang triển khai IHttpHandler, bạn sẽ nhận được một tham chiếu đến trang hiện đang thực thi.

HttpContext.Currentđơn giản chỉ trả về thể hiện singleton của HttpContext. Do đó, nó không phải và không bao giờ có thể là một trang.


2
Chỉ cần một lưu ý cho bất cứ ai đọc này. Câu trả lời dưới đây là tương tự nhưng với một ví dụ (tức là bạn sử dụng HttpContext.Current.Handler).
mike nelson

15

Bạn có thể muốn sử dụng HttpContext.Current.CurrentHandlernếu bạn muốn trang chính xác hiện đang thực thi. Ví dụ: một yêu cầu cho Default.aspx được gửi, nhưng một lỗi xuất hiện và bạn thực hiện Response.Transfervới trang ErrorHandler.aspx tùy chỉnh của mình. CurrentHandlersẽ trả về thể hiện của ErrorHandler.aspx (nếu được gọi sau lỗi) trong khi HttpContext.Current.Handlersẽ trả về thể hiện của Default.aspx.


0

Vui lòng xem câu trả lời của tôi:
Tại sao HttpContext.Current.Handler là null?

Có thể giải quyết vấn đề của bạn.


Tôi đang sử dụng cùng một mã cho công việc của mình, nhưng tôi rất khó chịu vì tôi không biết chi tiết của công việc. Vì vậy, đã phát triển mã này cho từ ngữ của tôi. Tôi nghĩ rằng Đặt mã ở đây để giúp bạn bè có vấn đề với tôi. Cảm ơn John Saunders.
Amin Ghaderi
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.