[ASP.NET]實現無ViewState的WebForm

摘要:[ASP.NET]實現無ViewState的WebForm

先說明一點,除非對網路流量非常斤斤計較,在一般情況下,其實不需要這麼做。

大家應該都知道類似GridView這類具有分頁、排序、編輯功能的控制項,若再搭配自動格式化來美化版面所造成的ViewState是不小的。看到seanyhkao大所發表的讓ViewState存到Session去吧這篇,想再提供另一種解決方案(但就要多寫一點程式囉!)。

除了Session外還有其它儲存媒體可供選擇,在這裡我使用文字檔的方式來保存ViewState(當然你也可以選擇DB),但有個問題必需搞清楚,就是網頁無ViewState情況下,使用者按上一頁/下一頁後再PostBack時必需與文字檔Mapping才能成功的還原狀態。所以文字檔命名是關鍵。
所以在使用者進入網站時就將他的SessionID固定住再搭配網頁名稱來作為文字檔檔名(SessionID_WebPageName.viewstate)

實作

固定住SessionID可以在Global.asax中設定
 

我從北風資料庫抓出Products資料表用GridView透在網頁上,再啟用排序與分頁的功能所造成的ViewState達到2732bytes

我希望將ViewState完全消失,保留於Server端的文字檔中。
建立一個類別檔(.cs),建立一個類別繼承System.Web.UI.Page,來作為aspx的BasePage
再來覆寫PageStatePersister屬性來改寫ViewState保存性機制,改寫的方式就是回傳一個繼承自PageStatePersister類別的自訂類別。

建立一個名為FileTextPageStatePersister的類別,它繼承自PageStatePersister抽象類別,所以必需實作Load()與Save()二個方法,這二個方法分別用來實作該如何將ViewState處置。
我們將ViewState序列化後結果存於網站根目錄下的ViewStateDir資料夾內,再用檔名來變識使用者與網頁還原ViewState狀態。

再來將aspx所繼承的類別改為繼承自訂的BasePage
這時ViewState大小為0bytes

註:
1.ViewState大小如何取得是使用JavaScript讀取__VIEWSTATE隱藏欄位

2.使用一陣子後會發現文字檔的數量越來越多,這時候就必需砍檔,可以寫一隻ConsoleApplication或著Windows Services(較佳)來砍檔,砍檔條件可以依據Session的timeout大小與文字檔的最後修改時間來做判斷。

程式碼點此下載

 參考:
ASP.NET 檢視狀態概觀
PageStatePersister 類別