[ASP.NET]ASP.NET AJAX頁面生命週期

[ASP.NET]ASP.NET AJAX頁面生命週期

ASP.NET寫一段時間的人對ASP.NET的頁面生命週期應該不陌生,頁面的生命週期簡化來看,最少會有OnInit-->Load-->Render等等步驟,詳細的內容可以參考這邊:

ASP.NET Life-cycle

我們主要關注以下這幾個事件:

image

這部分是說明ASP.NET的網頁在Postback後的執行週期,但我們也知道,ASP.NET的網頁不是只有後端程式,前端的Javascript跟html的render部分,我們也不能不在意,何況有些程式我們可能會寫在body的onload事件中,做為整個頁面全部載入完成後再做些處理,所以整個ASP.NET網頁的週期我們連同前端一起考量的話會變成這個樣子:

image

當Client端submit form到Server時,先依序執行ASP.NET頁面週期的各階段,最後response回client端,在client Render完網頁內容後觸發body onload的事件,並結束一次postback動作,這樣的生命週期相信大家不會陌生,如果我們要自己做頁面遮罩,可能就在ValidatorOnSubmit驗證通過時,將進行submit時將遮罩蓋起來,在body onload的最後將遮罩拿掉。

ASP.NET的life cycle大致上會這樣運作,但今天如果我們使用ASP.NET AJAX的部分刷新,我們有辦法實現等同於上方的架構嗎?因為有些規格就是要在body onload中做動作,確保整個畫面是ready的,又或者今天打算自己搞一個partial refresh的遮罩,不用ASP.NET AJAX提供的功能,那該如何進行?

我們先看一下ASP.NET AJAX的頁面生命週期,先參考:

ASP.NET AJAX Life-cycle

我們主要關注以下這幾個事件:

image

initializeRequest:在非同步刷新前觸發,在這邊可以檔掉刷新事件

beginRequest:在非同步刷新送出前觸發,跑到這階段已經無法透過程式檔掉刷新事件了

pageLoading:在非同步刷新的Server端事件處理完,回到client準備進行部分頁面的更新時

pageLoaded:在非同步刷新的Server端事件處理完,回到client準備進行部分頁面的更新完

endRequest:頁面完成刷新,結束本次非同步刷新事件時

 

原則上使用UpdatePanel來做局部刷新,Server端的ASP.NET頁面週期也會執行,所以在Server端的程式,與上頭的ASP.NET網頁是沒有太大差異的,但因為沒有做整個頁面的刷新,body沒有被重整,onload事件也不會被觸發,本來的onload事件我們可以寫在哪呢?上面五個週期中,哪一個最適合呢?我是選擇了endRequest(或許pageLoaded更合適),代表整個頁面已經載入完成,在這邊判斷如果沒有錯誤的話,就觸發頁面最後的自訂動作。

依以上的概念,我們把ASP.NET全頁刷新的頁面週期拿來與ASP.NET AJAX的部分刷新的頁面週期做一個比對,大致可以畫出下面這張圖:

image

透過這樣的對比,我們可以將本來全頁刷新的動作,搬到部分刷新的相對位置來做一些處理,說有什麼做不到的嗎?個人認為已經不太多了,只是要達到相同效果,還是要多花一些時間就是了。

PS.以上是一些架構上的思路,並非說兩者相等,請大家不要誤會。

游舒帆 (gipi)

探索原力Co-founder,曾任TutorABC協理與鼎新電腦總監,並曾獲選兩屆微軟最有價值專家 ( MVP ),離開職場後創辦探索原力,致力於協助青少年培養面對未來的能力。認為教育與組織育才其實息息相關,都是在為未來儲備能量,2018年起成立為期一年的專題課程《職涯躍升的關鍵24堂課》,為培養台灣未來的領袖而努力。