再談ASP.NET4 – Page類分析

來源:互聯網
上載者:User

本文整理自《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

在頁從記憶體中被卸載後但尚未釋放前引發

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.