国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
關于asp.net中頁面事件加載的先后順序
關于asp.net中頁面事件加載的先后順序
一、ASP.NET 母版頁和內(nèi)容頁中的事件
母版頁和內(nèi)容頁都可以包含控件的事件處理程序。對于控件而言,事件是在本地處理的,即內(nèi)容頁中的控件在內(nèi)容頁中引發(fā)事件,母版頁中的控件在母版頁中引發(fā)事件??丶录粫膬?nèi)容頁發(fā)送到母版頁。同樣,也不能在內(nèi)容頁中處理來自母版頁控件的事件。
在某些情況下,內(nèi)容頁和母版頁中會引發(fā)相同的事件。例如,兩者都引發(fā) Init 和 Load 事件。引發(fā)事件的一般規(guī)則是初始化事件從最里面的控件向最外面的控件引發(fā),所有其他事件則從最外面的控件向最里面的控件引發(fā)。
請記住,母版頁會合并到內(nèi)容頁中并被視為內(nèi)容頁中的一個控件,這一點十分有用。
下面是母版頁與內(nèi)容頁合并后事件的發(fā)生順序:
母版頁控件 Init 事件。
內(nèi)容控件 Init 事件。
母版頁 Init 事件。
內(nèi)容頁 Init 事件。
內(nèi)容頁 Load 事件。
母版頁 Load 事件。
內(nèi)容控件 Load 事件。
內(nèi)容頁 PreRender 事件。
母版頁 PreRender 事件。
母版頁控件 PreRender 事件。
內(nèi)容控件 PreRender 事件。
母版頁和內(nèi)容頁中的事件順序?qū)τ陧撁骈_發(fā)人員并不重要。但是,如果您創(chuàng)建的事件處理程序取決于某些事件的可用性,那么您將發(fā)現(xiàn),了解母版頁和內(nèi)容頁中的事件順序很有幫助。
二、關于asp.net中頁面事件加載的先后順序
1、Page 執(zhí)行中將按照如下順序激活事件:
Page.PreInit
Page.Init
Page.InitComplite
Page.PreLoad
Page.Load
Page.LoadComplete
Page.PreRender
Page.PreRenderComplete
2、如果頁面從另一個頁面繼承,如BasePage:System.Web.UI.Page,在BasePage中做了一些擴展,如權限檢查,而其他頁面從BasePage繼承,
則BasePage和最終Page的事件激活順序是:
UI.PreInit
Page.PreInit
UI.Init
Page.Init
UI.InitComplite
Page.InitComplite
UI.PreLoad
Page.PreLoad
UI.Load
Page.Load
UI.LoadComplete
Page.LoadComplete
UI.PreRender
Page.PreRender
UI.PreRenderComplete
Page.PreRenderComplete
3、如果使用了MasterPage,則MasterPage中的事件和ContentPage中的事件按照下面順序激活:
ContentPage.PreInit
Master.Init
ContentPage.Init
ContentPage.InitComplite
ContentPage.PreLoad
ContentPage.Load
Master.Load
ContentPage.LoadComplete
ContentPage.PreRender
Master.PreRender
ContentPage.PreRenderComplete
4、更進一步,如果ContentPage繼承BasePage,那么,各事件的執(zhí)行順序?qū)⒆兂桑?div style="height:15px;">
UI.PreInit
ContentPage.PreInit
Master.Init
UI.Init
ContentPage.Init
UI.InitComplite
ContentPage.InitComplite
UI.PreLoad
ContentPage.PreLoad
UI.Load
ContentPage.Load
Master.Load
UI.LoadComplete
ContentPage.LoadComplete
UI.PreRender
ContentPage.PreRender
Master.PreRender
UI.PreRenderComplete
ContentPage.PreRenderComplete
這讓我知道了他們有繼承時加載的順序。
即:先加載繼承頁的,再加載自己的,如果繼承頁有繼承則先加載繼承頁的繼承。
其實是個很簡單的內(nèi)容。順便寫下Page事件:
事件處理器名稱
發(fā)生時間
Page_Init
在Web窗體的視圖狀態(tài)加載服務器控件并對其初始化。
這是web窗體生命周期的第一步
Page_Load
在Page對象上載入服務器控件。由于此時視圖狀態(tài)信息是可以使用的,
因此載這里可以用代碼來改變空間的設置或者載頁面上顯示文本。
Page_PreRender
應用程序?qū)⒁尸F(xiàn)Page對象
Page_Unload
頁面從內(nèi)存中卸載
Page_Error
發(fā)生未處理的異常
Page_AbortTransaction
事務處理被終止
Page_CommitTransaction
事務處理被接受
Page_DataBinding
把頁面上的服務器空間和數(shù)據(jù)源綁定載一起
Page_Disposed
Page對象從內(nèi)存中釋放掉。這是Page對象生命周期中的最后一個事件
Init,Load,PreRender事件執(zhí)行順序:
1)控件的Init事件
2)控件所在頁面的Init事件
3)控件所在頁面的Load事件
4)控件的Load事件
5)控件所在頁面的PreRender事件
6)控件的PreRender事件
規(guī)律:
1)Init事件從最里面的控件(包括用戶控件及普通控件)向最外面的控件(頁面)引發(fā),Load及PreRender等其他事件從最外面的控件向最里面的控件引發(fā);
2)控件之間相同事件的執(zhí)行順序依控件在頁面的位置按從左到右,從上到下的先后順序執(zhí)行。
注意:
1)切記用戶控件也被視為頁面中的一個控件;
2)把用戶控件作為單獨的一個特殊頁面來看,它本身及其所包含的控件同樣遵守相同的規(guī)律;
3)有時在客戶端程序(如javascript)中會用到客戶端body對像的onload事件,注意這個客戶端事件是最后執(zhí)行,即在服務器端所有事件執(zhí)行完后才執(zhí)行。
============================================================================================
轉載一篇關于頁面對象模型的文章,說得比較詳細,有助理解。沒事的時候就多看兩遍,慢慢體會:)。
ASP.NET 頁面對象模型
Dino Esposito
Wintellect
2003 年 8 月
適用于:
Microsoft? ASP.NET
摘要:了解為 ASP.NET Web 頁面建立的事件模型,以及 Web 頁面轉變?yōu)?HTML 過程中的各個階段。ASP.NET HTTP 運行時負責管理對象管道,這些對象首先將請求的 URL 轉換成 Page 類的具體實例,然后再將這些實例轉換成純 HTML 文本。本文將探討那些作為頁面生命周期標志的事件,以及控件和頁面編寫者如何干預并改變標準行為。(本文包含一些指向英文站點的鏈接。)
目錄
簡介
真正的 Page 類
頁面的生命周期
執(zhí)行的各個階段
小結
簡介
對由 Microsoft? Internet 信息服務 (IIS) 處理的 Microsoft? ASP.NET 頁面的每個請求都會被移交到 ASP.NET HTTP 管道。HTTP 管道由一系列托管對象組成,這些托管對象按順序處理請求,并將 URL 轉換為純 HTML 文本。HTTP 管道的入口是 HttpRuntime 類。ASP.NET 結構為輔助進程中的每個 AppDomain 創(chuàng)建一個此類的實例。(請注意,輔助進程為每個當前正在運行的 ASP.NET 應用程序維護一個特定的 AppDomain。)
HttpRuntime 類從內(nèi)部池中獲取 HttpApplication 對象,并安排此對象來處理請求。HTTP 應用程序管理器完成的主要任務就是找到將真正處理請求的類。當請求 .aspx 資源時,處理程序就是頁面處理程序,即從 Page 繼承的類的實例。資源類型和處理程序類型之間的關聯(lián)關系存儲在應用程序的配置文件中。更確切地說,默認的映射集是在 machine.config 文件的 <httpHandlers> 部分定義的。但是,應用程序可以在本地的 web.config 文件中自定義自己的 HTTP 處理程序列表。以下這一行代碼就是用來為 .aspx 資源定義 HTTP 處理程序的。
<add verb="*" path="*.aspx" type="System.Web.UI.PageHandlerFactory"/>
擴展名可以與處理程序類相關聯(lián),并且更多是與處理程序工廠類相關聯(lián)。在所有情況下,負責處理請求的 HttpApplication 對象都會獲得一個實現(xiàn) IHttpHandler 接口的對象。如果根據(jù) HTTP 處理程序來解析關聯(lián)的資源/類,則返回的類將直接實現(xiàn)接口。如果資源被綁定到處理程序工廠,則還需要額外的步驟。處理程序工廠類實現(xiàn) IHttpHandlerFactory 接口,此接口的 GetHandler 方法將返回一個基于 IHttpHandler 的對象。
HTTP 運行時是如何結束這個循環(huán)并處理頁面請求的?ProcessRequest 方法在 IHttpHandler 接口中非常重要。通過對代表被請求頁面的對象調(diào)用此方法,ASP.NET 結構會啟動將生成瀏覽器輸出的進程。
真正的 Page 類
特定頁面的 HTTP 處理程序類型取決于 URL。首次調(diào)用 URL 時,將構建一個新的類,這個類被動態(tài)編譯為一個程序集。檢查 .aspx 資源的分析進程的結果是類的源代碼。該類被定義為命名空間 ASP 的組成部分,并且被賦予了一個模擬原始 URL 的名稱。例如,如果 URL 的終點是 page.aspx,則類的名稱就是 ASP.Page_aspx。不過,類的名稱可以通過編程方式來控制,方法是在 @Page 指令中設置 ClassName 屬性。
HTTP 處理程序的基類是 Page。這個類定義了由所有頁面處理程序共享的方法和屬性的最小集合。Page 類實現(xiàn) IHttpHandler 接口。
在很多情況下,實際處理程序的基類并不是 Page,而是其他的類。例如,如果使用了代碼分離,就會出現(xiàn)這種情況。代碼分離是一項開發(fā)技術,它可以將頁面所需的代碼隔離到單獨的 C# 和 Microsoft Visual Basic? .NET 類中。頁面的代碼是一組事件處理程序和輔助方法,這些處理程序和方法真正決定了頁面的行為??梢允褂?<script runat=server> 標記對此代碼進行內(nèi)聯(lián)定義,或者將其放置在外部類(代碼分離類)中。代碼分離類是從 Page 繼承并使用額外的方法的類,被指定用作 HTTP 處理程序的基類。
還有一種情況,HTTP 處理程序也不是基于 Page 的,即在應用程序配置文件的 <pages> 部分中,包含了 PageBaseType 屬性的重新定義。
<pages PageBaseType="Classes.MyPage, mypage" />
PageBaseType 屬性指明包含頁面處理程序的基類的類型和程序集。從 Page 導出的這個類可以自動賦予處理程序擴展的自定義方法和屬性集。
頁面的生命周期
完全識別 HTTP 頁面處理程序類后,ASP.NET 運行時將調(diào)用處理程序的 ProcessRequest 方法來處理請求。通常情況下,無需更改此方法的實現(xiàn),因為它是由 Page 類提供的。
此實現(xiàn)將從調(diào)用為頁面構建控件樹的 FrameworkInitialize 方法開始。FrameworkInitialize 方法是 TemplateControl 類(Page 本身從此類導出)的一個受保護的虛擬成員。所有為 .aspx 資源動態(tài)生成的處理程序都將覆蓋 FrameworkInitialize。在此方法中,構建了頁面的整個控件樹。
接下來,ProcessRequest 使頁面經(jīng)歷了各個階段:初始化、加載視圖狀態(tài)信息和回發(fā)數(shù)據(jù)、加載頁面的用戶代碼以及執(zhí)行回發(fā)服務器端事件。之后,頁面進入顯示模式:收集更新的視圖狀態(tài),生成 HTML 代碼并隨后將代碼發(fā)送到輸出控制臺。最后,卸載頁面,并認為請求處理完畢。
在各個階段中,頁面會觸發(fā)少數(shù)幾個事件,這些事件可以由 Web 控件和用戶定義的代碼截取并進行處理。其中的一些事件是嵌入式控件專用的,因此無法在 .aspx 代碼級進行處理。
要處理特定事件的頁面應該明確注冊一個適合的處理程序。不過,為了向后兼容早期的 Visual Basic 編程風格,ASP.NET 也支持隱式事件掛鉤的形式。默認情況下,頁面會嘗試將特定的方法名稱與事件相匹配,如果實現(xiàn)匹配,則認為此方法就是匹配事件的處理程序。ASP.NET 提供了六種方法名稱的特定識別,它們是 Page_Init、Page_Load、Page_DataBind、Page_PreRender 和 Page_Unload。這些方法被認為是由 Page 類提供的相應事件的處理程序。HTTP 運行時會自動將這些方法綁定到頁面事件,這樣,開發(fā)人員就不必再編寫所需的粘接代碼了。例如,如果命名為 Page_Load 的方法綁定到頁面的 Load 事件,則可省去以下代碼。
this.Load += new EventHandler(this.Page_Load);
對特定名稱的自動識別是由 @Page 指令的 AutoEventWireup 屬性控制的。如果該屬性設置為 false,則要處理事件的所有應用程序都需要明確連接到頁面事件。不使用自動綁定事件的頁面性能會稍好一些,因為不需要額外匹配名稱與事件。請注意,所有 Microsoft Visual Studio? .NET 項目都是在禁用 AutoEventWireup 屬性的情況下創(chuàng)建的。但是,該屬性的默認設置是 true,即 Page_Load 等方法會被識別,并被綁定到相關聯(lián)的事件。
下表中按順序列出了頁面的執(zhí)行包括的幾個階段,執(zhí)行的標志是一些應用程序級的事件和/或受保護并可覆蓋的方法。
表 1:ASP.NET 頁面生命中的關鍵事件
階段頁面事件可覆蓋的方法
頁面初始化Init
加載視圖狀態(tài) LoadViewState
處理回發(fā)數(shù)據(jù) 任意實現(xiàn) IPostBackDataHandler 接口的控件中的 LoadPostData 方法
加載頁面Load
回發(fā)更改通知 任意實現(xiàn) IPostBackDataHandler 接口的控件中的 RaisePostDataChangedEvent 方法
處理回發(fā)事件由控件定義的任意回發(fā)事件任意實現(xiàn) IPostBackDataHandler 接口的控件中的 RaisePostBackEvent 方法
頁面顯示前階段PreRender
保存視圖狀態(tài) SaveViewState
顯示頁面 Render
卸載頁面Unload
以上所列的階段中有些在頁面級是不可見的,并且僅對服務器控件的編寫者和要創(chuàng)建從 Page 導出的類的開發(fā)人員有意義。Init、Load、PreRender、Unload,再加上由嵌入式控件定義的所有回發(fā)事件,就構成了向外發(fā)送頁面的各個階段標記。
執(zhí)行的各個階段
頁面生命周期中的第一個階段是初始化。這個階段的標志是 Init 事件。在成功創(chuàng)建頁面的控件樹后,將對應用程序觸發(fā)此事件。換句話說,當 Init 事件發(fā)生時,.aspx 源文件中靜態(tài)聲明的所有控件都已實例化并采用各自的默認值??丶梢越厝?Init 事件以初始化在傳入的 Web 請求的生命周期內(nèi)所需的所有設置。例如,這時控件可以加載外部模板文件或設置事件的處理程序。請注意,這時視圖狀態(tài)信息尚不可用。
初始化之后,頁面框架將加載頁面的視圖狀態(tài)。視圖狀態(tài)是名稱/值對的集合,在此集合中,控件和頁面本身存儲了對所有 Web 請求都必須始終有效的全部信息。視圖狀態(tài)代表了頁面的調(diào)用上下文。通常,它包含上次在服務器上處理頁面時控件的狀態(tài)。首次在會話中請求頁面時,視圖狀態(tài)為空。默認情況下,視圖狀態(tài)存儲在靜默添加到頁面的隱藏字段中,該字段的名稱是 __VIEWSTATE。通過覆蓋 LoadViewState 方法(Control 類的受保護、可覆蓋方法),組件開發(fā)人員可以控制視圖狀態(tài)的存儲方式以及視圖狀態(tài)的內(nèi)容映射到內(nèi)部狀態(tài)的方式。
有些方法(如 LoadPageStateFromPersistenceMedium 以及其對應的 SavePageStateToPersistenceMedium),可以用來將視圖狀態(tài)加載并保存到其他存儲介質(zhì)(例如會話、數(shù)據(jù)庫或服務器端文件)中。與 LoadViewState 不同,上述方法只能在從 Page 導出的類中使用。
存儲視圖狀態(tài)之后,頁面樹中控件的狀態(tài)與頁面最后一次顯示在瀏覽器中的狀態(tài)相同。下一步是更新它們的狀態(tài)以加入客戶端的更改。處理回發(fā)數(shù)據(jù)階段使控件有機會更新其狀態(tài),從而準確反映客戶端相應的 HTML 元素的狀態(tài)。例如,服務器的 TextBox 控件對應的 HTML 元素是 <input type=text>。在回發(fā)數(shù)據(jù)階段,TextBox 控件將檢索 <input> 標記的當前值,并使用該值來刷新自己內(nèi)部的狀態(tài)。每個控件都要從回發(fā)的數(shù)據(jù)中提取值并更新自己的部分屬性。TextBox 控件將更新它的 Text 屬性,而 CheckBox 控件將刷新它的 Checked 屬性。服務器控件和 HTML 元素的對應關系可以通過二者的 ID 找到。
在處理回發(fā)數(shù)據(jù)階段的最后,頁面中的所有控件的狀態(tài)都將使用客戶端輸入的更改來更新前一狀態(tài)。這時,將對頁面觸發(fā) Load 事件。
頁面中可能會有一些控件,當其某個敏感屬性在兩個不同的請求中被修改時,需要完成特定的任務。例如,如果 TextBox 控件的文本在客戶端被修改,則此控件將觸發(fā) TextChanged 事件。每個控件在其一個或多個屬性被修改為客戶端輸入的值時都可以決定觸發(fā)相應的事件。對于這些更改對其非常關鍵的控件,控件實現(xiàn) IPostBackDataHandler 接口,此接口的 LoadPostData 方法是在 Load 事件后立即調(diào)用的。通過對 LoadPostData 方法進行編碼,控件將驗證自上次請求后是否發(fā)生了關鍵更改,并觸發(fā)自己的更改事件。
頁面生命周期中的關鍵事件是被調(diào)用以執(zhí)行服務器端代碼的事件,此代碼與客戶端觸發(fā)的事件相關聯(lián)。當用戶單擊按鈕時,將回發(fā)頁面?;匕l(fā)值的集合中包括啟動整個操作的按鈕的 ID。如果控件實現(xiàn) IPostBackEventHandler 接口(如按鈕和鏈接按鈕),頁面框架將調(diào)用 RaisePostBackEvent 方法。此方法的行為取決于控件的類型。就按鈕和鏈接按鈕而言,此方法將查找 Click 事件處理程序并運行相關的委托。
處理完回發(fā)事件之后,頁面就可以顯示了。這個階段的標志是 PreRender 事件??丶梢岳眠@段時間來執(zhí)行那些需要在保存視圖狀態(tài)和顯示輸出的前一刻執(zhí)行的更新操作。下一個狀態(tài)是 SaveViewState,在此狀態(tài)中,所有控件和頁面本身都將更新自己 ViewState 集合的內(nèi)容。然后,將得到序列化、散列、Base64 編碼的視圖狀態(tài),而且此視圖狀態(tài)與隱藏字段 __VIEWSTATE 相關聯(lián)。
通過覆蓋 Render 方法可以改變各個控件的顯示機制。此方法接受 HTML 書寫器對象,并使用此對象來積累所有要為控件生成的 HTML 文本。Page 類的 Render 方法的默認實現(xiàn)包括對所有成員控件的遞歸調(diào)用。對于每個控件,頁面都將調(diào)用 Render 方法,并緩存 HTML 輸出。
頁面生命中的最后一個標志是 Unload 事件,在頁面對象消除之前發(fā)生。在此事件中,您應該釋放所有可能占用的關鍵資源(例如文件、圖形對象、數(shù)據(jù)庫連接等)。
在此事件之后,也就是最后,瀏覽器接收 HTTP 響應數(shù)據(jù)包并顯示頁面。
小結
ASP.NET 頁面對象模型因其事件機制而顯得格外新穎獨特。Web 頁面由控件組成,這些控件既可以產(chǎn)生豐富的基于 HTML 的用戶界面,又可以通過事件與用戶交互。以前,在 Web 應用程序的上下文中設置事件模型是件有挑戰(zhàn)性的工作??晌覀凅@奇的看到,客戶端生成的事件可以由服務器端的代碼來解決,而且只進行一些相應的修改后,此過程仍可以輸出相同的 HTML 頁面。
掌握這個模型對于了解頁面生命周期的各個階段,以及頁面對象如何被 HTTP 運行時實例化并使用是非常重要的。
關于作者
Dino Esposito 是一位來自意大利羅馬的培訓教師和顧問。作為Wintellect 團隊的成員,Dino 專門研究 ASP.NET 和 ADO.NET,主要在歐洲和美國從事教學和咨詢工作。此外,Dino 還負責管理 Wintellect 的 ADO.NET 課件,并為MSDN 期刊的“Cutting Edge”專欄撰寫文章。要與他聯(lián)系,請向dinoe@wintellect.com 發(fā)送電子郵件。
本站僅提供存儲服務,所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
aspx頁面事件執(zhí)行順序
關于Asp.NET中頁面事件加載的先后順序
Asp.net2.0頁面執(zhí)行順序
說不清 ASP.NET頁面生命周期描述 (轉)
Page類與Control類的生命周期(life cycle)比較總結
ASP.NET頁面——頁面事件
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服