ASP.NET裡不可避免的要用上viewstate,怎麼用它估計大家都用得爛熟了,它的優點缺點用過的人也能說出個大概.其中被說得最多的還是它的缺點,viewstate的使用使得頁面大小長胖了好幾KB,甚至上M,最直接的效應就是使得頁面的載入異常的緩慢.因此對於viewstate的使用及最佳化是那些ASPDotNet最佳化教程裡談論得較多的,至於那些怎麼禁用viewstate,緩衝策略等也就不詳細討論了.
如果不嫌IO操作慢,並且伺服器也夠地方放,何不把viewstate的內容儲存在伺服器上,這樣可以實現用戶端頁面的viewstate大小為0,實現起來也很簡單,只不過是重寫了Page類的兩個虛方法SavePageStateToPersistenceMedium和LoadPageStateFromPersistenceMedium,以下是簡單的實現方法.
儲存viewstate
1// 對於DotNet 1.1 可採用 LosFormatter
2 ObjectStateFormatter m_stateFormatter;
3 private ObjectStateFormatter StateFormatter
4 {
5 get
6 {
7 if (m_stateFormatter == null)
8 {
9 m_stateFormatter = new ObjectStateFormatter();
10 }
11 return m_stateFormatter;
12 }
13 }
14
15 /**//// <summary>
16 /// 重寫SavePageStateToPersistenceMedium
17 /// 儲存viewstate內容到文本中
18 /// </summary>
19 /// <param name="state"></param>
20 protected override void SavePageStateToPersistenceMedium(object state)
21 {
22 FileStream fs = new FileStream(GetFileName(), FileMode.OpenOrCreate, FileAccess.Write, FileShare.None);
23 StateFormatter.Serialize(fs, state);
24 fs.Close();
25 }
26
27 /**//// <summary>
28 /// 重寫LoadPageStateFromPersistenceMedium
29 /// 從文本中讀取viewstate內容
30 /// </summary>
31 /// <returns></returns>
32 protected override object LoadPageStateFromPersistenceMedium()
33 {
34 FileStream fs = new FileStream(GetFileName(), FileMode.OpenOrCreate, FileAccess.Read, FileShare.Read);
35 object viewStatObject = StateFormatter.Deserialize(fs);
36 fs.Close();
37 return viewStatObject;
38 }
39
40 protected override void OnInit(EventArgs e)
41 {
42 // 給session賦值,以保證每次請求的不建立新的session
43 Session["a"] = "temp";
44 base.OnInit(e);
45 }
46
47 /**//// <summary>
48 /// 產生並擷取檔案路徑
49 /// </summary>
50 /// <returns></returns>
51 private string GetFileName()
52 {
53 // 以sessionid 和 請求路徑 組成 儲存viewstate的檔案名稱
54 string url = Request.RawUrl.Replace("/", "");
55 return "E:\\" + Session.SessionID + "_" + url + "_viewstate.txt";
56 }
最後的效果就是,查看頁面的html代碼,發現viewstate的value是空的.1 <input type="hidden" name="__VIEWSTATE" id="
2 __VIEWSTATE" value="" />
另外對於Page類還有很多虛方法,好好應用還是挺有趣的.