程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> ASP.NET頁面事件:順序與回傳詳解

ASP.NET頁面事件:順序與回傳詳解

編輯:.NET實例教程

一、初始化

當頁面被提交請求第一個方法永遠是構造函數。您可以在構造函數裡面初始一些自定義屬性或對象,不過這時候因為頁面還沒有被完全初始化所以多少會有些限制。特別地,您需要使用HttpContext對象。當前可以使用的對象包括QueryString,Form以及CookIEs集合,還有Cache對象。注意:在構造函數裡是不允許使用Session的。

下一個將執行的方法是AddParsedSubObject方法,這個方法將添加所有獨立的控件並把頁面組成一個控件集合樹,這個方法經常被一些高級的頁面模板解決方案(Page Template Solutions)重寫以便添加頁面內容到頁面模板(Page Template)中一些特殊的控件中。這個方法遞歸應用到所有的頁面控件及相應的的每個子控件,所有的控件都是在這個方法中開始最早的初始化。

頁面類中下一個將執行的方法是DeterminePostBackMode。這個方法允許您修改IsPostBack的值及相關的事件。如果您需要從數據庫中加載ViewState這個方法將特別有用,因為VIEwState只有在IsPostBack為真的情況下才會進行恢復。返回空將會導致強制執行非回傳,返回Request.Form則強制執行一個回傳。除非在特殊情況下,否則並不建議去操作這個,因為這個還會影響其他的事件。

下一個將要執行的方法是OnInit方法,一般這是第一個真正被使用的方法。這個方法觸發時,所有頁面定義中的控件執行初始化,這意味著所有在頁面中定義的值應用到相應的控件上。不過,VIEwState和傳回的值還不會應用到控件上,因此,任何被代碼或用戶改變的值還沒有被恢復到控件上。這個方法通常是最好的創建、重創建動態控件的好地方。

二、恢復及加載

下一個方法,LoadPageStateFromPersistenceMedium只會在頁面被回傳的時候才會被執行。如果因為使用Session或自定義存儲方式,您修改了後面將要提到的影響ViewState保存方式的方法SavePageStateToPersistenceMedium,則這個方法需要被重寫。默認的實現中ViewState是一種Base64格式編碼,並且被保存在頁面的隱藏域中,您可以使用這篇文章中提及的方法修改ViewState按以上兩種方式保存。注意:這個方法並沒有真正加載VIEwState到頁面或頁面控件中。

當得到ViewState後,下一個方法LoadViewSate,將以遞歸的方式恢復ViewState到頁面及各個頁面控件或子控件中。這個方法執行後,每個控件都將恢復到上一次的狀態,但是用戶提交的數據還沒有應用到控件上,因為他們不是ViewState的一部分。這個方法主要用於恢復您在其他事件中動態生成的控件的值,他們的值是您手動保存在VIEwSate中,並且現在已經失效。

下一個方法是ProcessPostData,這個方法也同樣是回傳的時候才會被執行,並且不允許被重寫,這個是頁面基類的私有方法。這個方法通過匹配控件的名稱恢復相應的用戶提交的控件的值,到這一步意味著整個頁面都已經被完全恢復了。唯一要記住的是所有動態控件的創建必須在這個方法之前。這個方法也是記錄後面的改變事件的方法。

下一個方法是OnLoad方法,通常這是用得最多的方法,因為這個方法是頁面生存期第一個恢復了所有值的地方。大多數代碼根據判斷IsPostBack來決定是否重新設置控件狀態。您也可以在這個方法中調用Validate並且檢查IsValid的值。也可以在這個方法中創建動態控件,並且該控件的所有的方法都會被執行以追上當前頁面的狀態包括VIEwSate,不過不包括回傳的值。

三、事件處理

下一個方法還是ProcessPostData,實際上就是前一個方法的另一次調用,它仍然是只在回傳的時候執行並且由於是私有方法不可以被重寫。如果您是第一次看頁面的運行軌跡也許會覺得這個方法有些多余。但實際上這個方法是必要的因為在OnLoad中創建的動態控件也需要他們回傳的值。任何在這以後創建的控件將可以得到他們的VIEwState,但是不能再得到他們的回傳的值,並且不會觸發任何值改變事件(Change Event)。

下一個方法,RaiseChangedEvents,也是只在回傳頁面中執行,並且也因為是基類的私有方法所有不能被繼承。在整個頁面生存期中,是在這兒根據之前的ProcessPostData記錄的控件的值和提交的值是否不同來觸發值改變事件。您也許需要調用Validate或者檢查IsValid的值。這裡並沒有特別的說明多個值改變事件的執行先後順序。

下一個方法,RaisePostBackEvent,同樣是因為是基類的私有方法不能被繼承,同樣也是只在回傳頁面中執行。除非使用了AutoPostBack,不然這是實際提交表單事件執行的地方,特別是按鈕或者其實使用Javascript提交表單等。如果還沒有被手動調用過並且使用了驗證控件,那麼Validate會被調用。注意IE中有個BUG有時會允許提交但卻不觸發任何事件。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved