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