System.Web.UI.PageオブジェクトのPageプロパティ

Page オブジェクトの Page プロパティは もともと Page クラスの派生元となる System.Web.UI.Control クラスが持つプロパティであり、リクエストされた .aspx ファイルの Page オブジェクトの参照を返す。ユーザコントロール、カスタムコントロールのコード内で Page プロパティを参照するとそれらコントロールを含むページが返され、マスターページで Page プロパティを参照するとコンテンツページが返される。実装は、下記のとおり、自分自身が Page オブジェクトを保持していない場合、親を遡って Page オブジェクトを取得している。

Control.cs

public virtual Page Page {
    get {
        if (_page == null) {
            if (Parent != null) {
                _page = Parent.Page;
            }
        }
        return _page;
    }
    ...

以下は、動作確認用のサンプルコード

Site1.Master.vb

Public Class Site1
    Inherits System.Web.UI.MasterPage

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        Response.Write("<br />")
        Response.Write("Master:" & Me.GetHashCode() & "<br />")
        Response.Write("Master.Page:" & Page.GetHashCode() & "<br />")
        Response.Write("Master.Parent:" & Me.Parent.GetHashCode() & "<br />")
        Response.Write("HttpContext.Current.Handler is Page? :" & (Class1.GetPage() Is Page) & "<br />")
    End Sub

End Class


WebForm1.aspx.vb

Public Class WebForm1
    Inherits System.Web.UI.Page

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Response.Write("WebForm1:" & Me.GetHashCode() & "<br />")
        Response.Write("WebForm1.Page:" & Page.GetHashCode() & "<br />")
        Response.Write("WebForm1.Parent Is Nothing? :" & (Parent Is Nothing) & "<br />")
        Response.Write("Page Is Me? :" & (Page Is Me) & "<br />")
        Response.Write("HttpContext.Current.Handler is Page? :" & (Class1.GetPage() Is Page) & "<br />")
    End Sub

End Class

Class1.vb

Imports System.Web.UI

Public Class Class1
    Public Shared Function GetPage() As System.Web.UI.Page
        Return TryCast(HttpContext.Current.Handler, Page)
    End Function
End Class

結果

WebForm1:31461656
WebForm1.Page:31461656
WebForm1.Parent Is Nothing? :True
Page Is Me? :True
HttpContext.Current.Handler is Page? :True

Master:14859505
Master.Page:31461656
Master.Parent:31461656
HttpContext.Current.Handler is Page? :True