應用情境:
在給客戶開發一個asp.net工作流程系統時,因為某些Form內容過長,客戶提出要求在對Form的編輯過程中隨時能夠儲存當前輸入,並且能隨時恢複儲存時的狀態。因為form的提交有嚴格的驗證代碼,因此儲存不能執行驗證,而不經過驗證的代碼不能儲存到系統資料庫中。如果用暫存資料表儲存又顯麻煩,代碼量會增加很多,同時可能導致系統產生新的bug.
解決方案產生過程:
首先想到的就是通過儲存Page的ViewState,然後在恢複的時候用儲存過的ViewState來替換。可以通過重寫Page的如下兩個方法來實現:
protected override void SavePageStateToPersistenceMedium(object viewState)
protected override object LoadPageStateFromPersistenceMedium()
這樣是可以恢複儲存時的Page的ViewState,但是IsPostBack狀態在第一次訪問頁面的時候仍然是false,這樣雖然可以恢複儲存過的viewstate,但是無法置IsPostBack為true,從而導致Page仍然按照非PostBack來執行從而無法達到恢複狀態的目的。本想就此放棄,但是同事給我推薦了codeproject.com上的一篇文章 http://www.codeproject.com/aspnet/PersistentStatePage.asp
看過之後知道了如何置PostBack狀態,那就是重寫DeterminePostBackMode()方法,這樣我們在儲存頁面的狀態的時候不僅儲存ViewState而且儲存DeterminePostBackMode()傳回值,在恢複頁面的時候不僅恢複ViewState,同時重寫DeterminePostBackMode()方法,返回我們儲存頁面狀態時儲存的DeterminePostBackMode()所返回的NameValueCollection,這樣恢複頁面的時候就可以置IsPostBack為ture了,這樣目標就基本實現了,可以很輕鬆的將一個Page在首次訪問的時候就將其置為儲存時的狀態,並可以從這一狀態繼續往下操作(接下來的PostBack都會正常運轉)
在我的範例程式碼中,可以看到我還儲存了Request.Form,這是因為考慮到一些非ASP.NET Server Control的值都會在Request.Form,這樣恢複了Request.Form就不會在頁面恢複後PostBack的時候丟失這一類值(這裡對Request.Form的恢複可以稱之為假恢複)。
這樣我的目標就實現了,但是codeproject.com上的這篇文章所附代碼比我的更複雜,完成的恢複也更多,甚至恢複了QueryString,但是不適合我的應用程式要求,於是我做了一個適合我的應用程式要求的例子:
http://files.cnblogs.com/bestcomy/PageStatePersistAndRestore.rar