24h購物| | PChome| 登入
2012-09-03 17:48:35| 人氣607| 回應1 | 上一篇 | 下一篇

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

推薦 0 收藏 0 轉貼0 訂閱站台

ASP.NET頁面事件:順序與回傳詳解 (這個部落格相當好值得收藏)

只有執行LoadViewSate方法後,才能得到ViewSate值,所以在Page_Init事件中得不到ViewSate,當然,可以賦值

·當得到ViewState後,下一個方法LoadViewSate,將以遞迴的方式恢復ViewState到頁面及各個頁面控制項或子控制項中。·下一個方法是OnPreRender,一般這是在用戶端展現頁面之前改變頁面及其控制項的最後一次機會。

  一、初始化

  ·當頁面被提交請求第一個方法永遠是構造函數。您可以在構造函數裡面初始一些自訂屬性或物件,不過這時候因為 頁面還沒有被完全初始化所以多少會有些限制。特別地,您需要使用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有時會允許提交但卻不觸發任何事件。

  ·下一個方法是OnPreRender,一般這是在用戶端展現頁面之前改變頁面及其控制項的最後一次機會。您也可 以在這個方法裡面創建動態控制項,並且所有的方法都會被執行以追上當前頁面的狀態包括ViewSate,但是私有方法將不會被執行,這意味著不會有回傳的值 並且不會有事件觸發。由於IE中的BUG,這是一個沒有事件趕上PostBack的好地方 

·當得到ViewState後,下一個方法LoadViewSate,將以遞迴的方式恢復ViewState到頁面及各個頁面控制項或子控制項中。·下一個方法是OnPreRender,一般這是在用戶端展現頁面之前改變頁面及其控制項的最後一次機會。

  四、保存及顯示

  ·下一個方法是SaveViewState,不論是否是回傳頁面,均會遞迴的執行以保存頁面及其所有控制項的 ViewStateViewState基本上保存所有與定義在aspx中的原始值不同的值,不管是被代碼還是用戶所改變。注意控制項值是根據他們在頁面的 控制項樹中的位置來保存的,所以如果動態控制項後來加到了錯誤的位置將會導致混亂。

  ·下一個方法是SavePageStateToPersistenceMedium真正的保存頁面的 ViewSate。這個方法隨同LoadPageStateFromPersistenceMediumg 一起被重寫以便保存ViewStateSession或其它自訂資料,而不是用隱藏欄位。這對於低頻寬的用戶來說是很有幫助的。並且對於移動設備來 說,Session是默認設置。下面這篇文章描述了使用以上兩種方式保存ViewState的具體細節。注意在Asp.net中有個 BugAsp.net要求必須提交__viewstate欄位,即使是空的。

  ·下一個方法是Render方法,該方法遞迴的創建並發送相應控制項的html給流覽器。這個方法被一些頁面範本 方案重寫以添加一些通用的頁面頭與腳而不使用伺服器控制項,他們總是有一些額外的東西。注意這兒的修改只能使用純HTML,因為控制項在這兒已經被生成了。您 可以用StringBuilderStringWriterHtmlTextWriter捕獲相應的HTML輸出。

  · 最後的方法是OnUnload,這個方法會調用相應的Dispose方法。這個方法提供機會以便清空該頁面中使用的非託管資源,如關閉打開的檔案控制代碼,以 前打開的資料庫連接等。注意這個方法是在頁面已經發送到用戶端以後執行的,所以它只有影響伺服器物件,並且它不會顯示在頁面的顯示軌跡中。這就是頁面的生 存期,對於每一次請求都是這麼運行的。

  表1:頁面事件總結

  方法回傳控制項

  ConstructorAlwaysAll

  AddParsedSubObjectAlwaysAll

  DeterminePostBackModeAlwaysPage

  OnInitAlwaysAll

  LoadPageStateFromPersistenceMediumPostBackPage

  LoadViewStatePostBackAll

  ProcessPostData1PostBackPage

  OnLoadAlwaysAll

  ProcessPostData2PostBackPage

  RaiseChangedEventsPostBackPage

  RaisePostBackEventPostBackPage

  OnPreRenderAlwaysAll

  SaveViewStateAlwaysAll

  SavePageStateToPersistenceMediumAlwaysPage

  RenderAlwaysAll

  OnUnloadAlwaysAll

台長: nut
人氣(607) | 回應(1)| 推薦 (0)| 收藏 (0)| 轉寄
全站分類: 不分類 | 個人分類: 技術 |
此分類下一篇:學習asp.net比較完整的流程(轉)
此分類上一篇:[轉貼] 電腦裝修實錄

媚藥
很不錯的分享~!


http://www.yyj.tw/
2020-01-12 20:49:39
是 (若未登入"個人新聞台帳號"則看不到回覆唷!)
* 請輸入識別碼:
請輸入圖片中算式的結果(可能為0) 
(有*為必填)
TOP
詳全文