本文整理自《ASP.NET3.5核心編程》,以下內容適用於ASP.NET2.0以上版本。
Page類提供了由.aspx檔案建立所有對象的基本行為。(這個有<asp:Control />標籤產生C#描述的類型的對象的過程是我們看不到的,這是由編譯器自動完成的。)Page可以實現這個功能是由於其實現了IHttpHandler介面。實現IHttpHandler介面,就可以充當相應類型的(此處為.aspx檔案)的HTTP請求的處理常式。IHttpHandler介面的關鍵方法ProcessRequest完成了上述由.aspx檔案建立所有對象的過程。
Page的父類TemplateControl定義了頁面(或控制項)的一組準系統。TemplateControl上層的Control類定義ASP.NET伺服器端元素(包括頁面、控制項和使用者控制項)共用的屬性、方法和事件。TemplateControl實現的INamingContainer介面使Page可以作為控制項的容器。
Page類的屬性
Page類的屬性分為三類:內建對象、Worker屬性和頁面特有的屬性。以下分別介紹:
內部對象
這些屬性的類型都是頁內部的輔助對象,它們都是使頁面能夠正常執行的基本元素。
屬 性 |
說 明 |
Application |
返回HttpApplicationState類的執行個體。它代表當前應用程式的狀態。 |
Cache |
返回Cache類的執行個體,為ASP.NET應用程式實現了緩衝。其支援任務優先順序和到期(expiration),且比Application效率更高,功能更強 |
Profile |
返回ProfileCommon類的執行個體。它代表與請求關聯的、使用者特有的資料集合 |
Request |
返回HttpResponst類的執行個體。它代表當前HTTP請求。 |
Response |
返回HttpResponse類的執行個體。它用於將HTTP響應資料發送給用戶端。 |
Server |
返回HttpServerUtility類的執行個體。它提供處理Web請求的輔助方法。 |
Session |
返回HttpSessionState類的執行個體。它用於系統管理使用者特有的資料。 |
Trace |
返回TraceContext類的執行個體。它用於對頁面進行跟蹤 |
User |
返回IPrincipal類型的對象。它代表發出請求的使用者 |
Worker屬性
這些屬性用於承載資訊和提供準系統。在進行頁面編程時,這些屬性必不可少。
屬 性 |
說 明 |
ClientScript |
用於擷取ClientScriptManager對象,它包含頁面使用的用戶端指令碼。 |
Controls |
返回當前頁麵包含的字控制項集合 |
ErrorPage |
表示錯誤頁的屬性,在發生未處理頁面異常時,發出請求的瀏覽器會被重新導向到該頁面上 |
Form |
返回當前頁面的HtmlForm對象 |
Header |
返回代表當前頁面標題的對象。該對象實現了IPageHeader介面。 |
IsAsync |
用於指示當前頁是否被非同步處理常式調用。 |
IsCallback |
用於指示當前被載入的頁面是否為用戶端指令碼回調的結果。 |
IsCrossPagePostBack |
用於指示當前被載入的頁面是否是對另一個頁面回傳的響應 |
IsPostBack |
用於指示當前被載入的頁面是對用戶端回傳的響應,還是第一次載入 |
IsValid |
用於指示頁面驗證是否成功 |
Master |
返回MasterPage類的執行個體。它代表確定當前頁面外觀的主版頁面。 |
MasterPageFile |
表示當前頁面的主版頁面的檔案名稱的屬性 |
NamingContainer |
返回null |
Page |
返回當前Page對象(C#中就是this) |
PageAdapter |
返回當前Page對象的配接器物件 |
Parent |
返回null |
PreviousPage |
返回跨頁回傳中主調用頁的引用 |
TemplateSourceDirectory |
擷取當前頁面的虛擬路徑 |
Validators |
返回頁中包含的所有驗證控制項的集合 |
ViewStateUserKey |
字串類型的屬性,代表使用者特有的標識,用於對檢視狀態的內容進行散列加密(hash)。該措施是單鍵攻擊(one-click attack)的防線之一 |
解釋:由於Page對象處於層狀結構的根節點。所以,NamingContainer與Parent屬性總是返回null。ViewStateUserKey可以接受使用者特有的資訊,這些資訊可以是通過驗證的會話id等。此屬性可以被用來加密ViewState等。另外ViewStateUserKey必須在Page_Init中設定。
內容屬性
這些屬性代表頁面的可視和非可視屬性(attribute)
屬 性 |
說 明 |
ClientID |
總是返回Null 字元串 |
ClientQueryString |
擷取被請求URL的查詢字串部分。 |
ClientTarget |
預設為空白字串,允許開發人員指定瀏覽器類型,以便產生正確的HTML。設定此屬性將禁用瀏覽器的自動檢測功能 |
EnableViewState |
用於指示當前頁是否管理檢視狀態資訊。作用相當於@Page中的EnableViewState屬性 |
EnableViewStateMac |
用於指示ASP.NET是否需要產生電腦特有的身分識別驗證嗎(MAC),並將其追加到頁面的檢視狀態中 |
EnableTheming |
用於指示當前頁是否支援主題 |
ID |
總是返回Null 字元串 |
MaintainScrollPositionOnPostback |
用於指示在回傳後是否恢複用戶端瀏覽器的捲軸位置 |
SmartNavigation |
用於指示是否開啟智能導航。智能導航利用了大量瀏覽器特有的功能來加深使用者對頁面的體驗 |
StyleSheetTheme |
表示應用於當前頁面的樣式表名稱 |
Theme |
表示應用於頁面的主題的名稱。注意,若以編碼的方式設定主題,則只能在PreInit事件中進行。 |
Title |
表示頁面的標題的屬性 |
TraceEnabled |
開啟或關閉當前頁的跟蹤功能 |
TraceModeValue |
擷取或設定跟蹤模式 |
UniqueID |
總是返回Null 字元串 |
ViewStateEncryptionMode |
用於指示是否加密檢視狀態及加密方式 |
Visible |
用於指示ASP.NET是否呈現該頁面。如果將Visible設定為false,ASP.NET不會為該頁產生任何HTML代碼,且只有顯示使用Response.Write寫入的文本會被發往用戶端 |
Page對象中三個與ID有關的屬性 – ID、ClientID與UniqueID總返回Null 字元串,因為這些僅用於伺服器控制項,在Page中沒有意義。
Page類的方法
Page類的方法可以按功能分為以下幾類。分別總結如下:
用於呈現(產生標記)的方法
方 法 |
說 明 |
DataBind |
用於將頁面中的所有可資料繫結的控制項綁定到它所對應的資料來源上。DataBind方法本身不會產生代碼,但為後續的呈現鋪平道路 |
RenderControl |
用於將當前頁面輸出為HTML文本,如果啟用跟蹤,結果中將會包含跟蹤資訊 |
VerifyRenderingInServerForm |
控制項在產生時會調用該方法,以確保伺服器表單的主體中包含它們。該方法不會傳回值,但發生錯誤時會拋出異常 |
說明:在ASP.NET中所有runat屬性為server的控制項都需要放置在<form>標籤內,以使其可以由VerifyRenderingInServerForm方法來確保自身被正確呈現。
控制項相關的方法
方 法 |
說 明 |
DesignerInitialize |
當頁面處於Visual Studio設計器模式中時,該方法用於對Page類的執行個體進行初始化 |
FindControl |
通過控制項的ID在頁面的命名容器中尋找它。該搜尋不會進入本身也為命名容器的子控制項 |
GetTypeHashCode |
用於在運行時擷取由ASP.xxx_aspx頁面類生產的雜湊碼。在基類Page中,該方法的實現僅僅是返回0,而實際的頁面類會返回大量數字 |
GetValidators |
返回指定驗證組(validation group)的控制項驗證程式集合。 |
HasControls |
檢查當前頁是否包含子控制項 |
LoadControl |
用於編譯並載入.ascx檔案中的使用者控制項,之後會返回一Control對象。如果該使用者控制項支援緩衝,則返回PartialCachingControl |
LoadTemplate |
編譯並載入.ascx檔案中的使用者控制項,返回實現ITemplate介面的內部類的執行個體,它對該控制項進行了封裝。這個內部類名為SimpleTemplate |
MapPath |
擷取映射到絕對或相對虛擬路徑的完整物理地址 |
ParseControl |
用於對輸入的有效字串進行解析,返回指定標記文本所對應的控制項執行個體。如果該字串包含多個控制項,則只有第一個有效。runat屬性會被忽略。該方法返回的是一個Control類型的執行個體,因而必須轉換成更具體的類型 |
RegisterRequiresControlState |
將控制項註冊為具有持久性控制項狀態的。 |
RegisterRequiresPostBack |
用於註冊指定控制項,使其能夠接收到回傳處理通知(即便其ID與已回傳資料集合中的任何ID都不匹配)。該控制項必須實現IPostBackDataHandler介面 |
RegisterRequiresRaiseEvent |
用於註冊指定控制項,使其能夠處理輸入的回傳事件。該控制項必須實現IPostBackEventHandler介面 |
RegisterViewStateHandler |
該方法用於設定一內部標誌,以便保持當前頁檢視狀態,多數情況為內部使用。如果該方法沒有在預呈現階段被調用,則不會寫入任何檢視狀態。一般僅有頁面的HtmlForm伺服器控制項會調用該方法。不需要在使用者應用程式中調用 |
ResolveUrl |
根據TemplateSourceDirectory屬性值,將一相對URL解析為絕對URL |
Validate |
使頁中的所有驗證控制項對其被賦予的資訊進行驗證。ASP.NET 2.0支援驗證組,對需要驗證的控制項進行邏輯分類,且各組之間互不干擾 |
這些方法中,有如下值得說道的,LoadControl和LoadTemplate方法除了在傳回值得類型上,前者返回Control類對象,後者返回ITemplate類型對象外其於內部代碼都相同。另外這兩個方法區別於ParseControl方法的地方在於後者不引發編譯,而只是解析字串並推斷控制項資訊。該資訊用於控制項執行個體的建立及初始化。
指令碼相關的方法
以下這些Page類的方法用於將Html和指令碼代碼插入到用戶端頁面。
方法 |
說明 |
GetCallbackEventReference |
用於擷取用戶端函數的引用。該函數被調用時,將引發用戶端向伺服器端的回調事件 |
GetPostBackClientEvent |
轉而調用GetCallbackEventReference |
GetPostBackClientHyperlink |
用於向從GetPostBackEventReference返回的字串的開始處追加“javascript:”,如:javascript:__doPostBack('CtlID','') |
GetPostBackEventReference |
返回用戶端指令碼函數的原型。當該指令碼函數被調用時,將引起回傳的執行。它接受一個Control對象和一個參數,返回的字串形式如下:__doPostBack('CtlID','') |
IsClientScriptBlockRegistered |
用於確定頁面是否註冊了指定的用戶端指令碼。該方法已被標記為過時 |
IsStartupScriptRegistered |
用於確定頁面是否註冊了指定的用戶端啟動指令碼。該方法已被標記為過時 |
RegisterArrayDeclaration |
該方法用於將ECMAScript數組添加到用戶端頁面上。其接受一數組名和一個代表數組主體的字串。例如,如果以theArray 和“'a', 'b'”為參數調用該方法,則會得到以下JavaScript代碼:var theArray = new Array('a', 'b'); 該方法已被標記為過時 |
RegisterClientScriptBlock |
ASP.NET頁使用這個方法向用戶端頁面的HTTP <form>元素的開標記後添加指令碼代碼塊。該方法已被標記為過時 |
RegisterHiddenField |
用於自動向頁面註冊隱含欄位。該方法已被標記為過時 |
RegisterOnSubmitStatement |
該方法用於添加處理OnSubmit事件的用戶端指令碼代碼。該指令碼應為一個JavaScript函數,它會調用已在某處註冊的指令碼代碼。該方法已被標記為過時 |
RegisterStartupScript |
ASP.NET頁使用這個方法向用戶端頁面的HTTP <form>元素的閉標記前添加指令碼代碼塊。該方法已被標記為過時 |
SetFocus |
將瀏覽器的焦點設定在指定控制項上。 |
這其中很多方法被標記為過時,我們應該使用Page的ClientScript中的相關方法來操作用戶端指令碼。當我們使用RegisterXXX方法註冊指令碼時,指令碼被緩衝在一個結構中並在頁面渲染後背生產到最終的Html文檔裡。
Page類的事件
在頁面生命週期裡,會觸發一些列的事件。這些事件一般都標記者一個關鍵的處理階段。
事件 |
說明 |
AbortTransaction |
若ASP.NET頁參與自動事務,該事件會在事務中止時引發 |
CommitTransaction |
若ASP.NET頁參與自動事務,該事件會在事務提交時引發 |
DataBinding |
在頁的DataBind方法被調用時引發。該方法會對頁中的所有子控制項與其所對應的資料來源進行綁定 |
Disposed |
在頁從記憶體中被釋放後引發。該事件標誌著頁面生命週期的最後階段 |
Error |
在未處理異常被拋出時引發 |
Init |
在頁面被初始化時引發。該事件標誌著頁面生命週期的第一個階段 |
InitComplete |
在頁及其所有子控制項全部初始化完畢後引發。ASP.NET 1.x不支援該事件 |
Load |
在頁面初始化完畢後,進行載入時引發 |
LoadComplete |
在頁面載入結束,且伺服器事件也已引發完畢後引發。ASP.NET 1.x不支援該事件 |
PreInit |
在頁面的初始化階段開始時引發。ASP.NET 1.x不支援該事件 |
PreLoad |
在頁面的載入階段開始時引發。ASP.NET 1.x不支援該事件 |
PreRender |
在頁面即將被呈現時引發 |
PreRenderComplete |
在頁面的預呈現階段開始時引發。ASP.NET 1.x不支援該事件 |
SaveStateComplete |
在頁面的檢視狀態已儲存在持久性介質中後引發。ASP.NET 1.x不支援該事件 |
Unload |
在頁從記憶體中被卸載後但尚未釋放前引發 |