1: public class CachePageStatePersister : PageStatePersister
2: {
3: private const String RequestId = "__REQUESTID";
4: private const String ViewStateId = "VIEWSTATE:{0}";
5: private const String ControlStateId = "CONTROLSTATE:{0}";
6: private const String CacheTimeoutMinutesKey = "CacheTimeoutMinutes";
7:
8: private const Int32 DefaultCacheTimeoutMinutes = 10;
9:
10: public CachePageStatePersister(Page page): base(page)
11: {
12:
13: }
14:
15: public override void Load()
16: {
17: String id = this.Page.ID;
18:
19: if ((String.IsNullOrWhiteSpace(id) == true) || (id == "__Page"))
20: {
21: id = this.Page.Request.Form[RequestId];
22: }
23:
24: if (String.IsNullOrWhiteSpace(id) == true)
25: {
26: throw (new InvalidOperationException("Missing page id"));
27: }
28:
29: this.Page.ID = id;
30:
31: this.Page.ClientScript.RegisterHiddenField(RequestId, id);
32:
33: String viewStateId = String.Format(ViewStateId, id);
34: String controlStateId = String.Format(ControlStateId, id);
35:
36: this.ViewState = this.Page.Cache[viewStateId];
37: this.ControlState = this.Page.Cache[controlStateId];
38: }
39:
40: public override void Save()
41: {
42: if ((this.ControlState != null) || (this.ViewState != null))
43: {
44: String id = this.Page.ID;
45:
46: if ((String.IsNullOrWhiteSpace(id) == true) || (id == "__Page"))
47: {
48: id = Guid.NewGuid().ToString();
49:
50: this.Page.ID = id;
51:
52: this.Page.ClientScript.RegisterHiddenField(RequestId, id);
53: }
54:
55: Int32 cacheTimeoutMinutes = DefaultCacheTimeoutMinutes;
56:
57: if (String.IsNullOrWhiteSpace(ConfigurationManager.AppSettings[CacheTimeoutMinutesKey]) == false)
58: {
59: Int32.TryParse(ConfigurationManager.AppSettings[CacheTimeoutMinutesKey], out cacheTimeoutMinutes);
60: }
61:
62: if (this.Page.Items[CacheTimeoutMinutesKey] is Int32)
63: {
64: cacheTimeoutMinutes = (Int32)this.Page.Items[CacheTimeoutMinutesKey];
65: }
66:
67: String viewStateId = String.Format(ViewStateId, id);
68: String controlStateId = String.Format(ControlStateId, id);
69:
70: if (this.ViewState != null)
71: {
72: this.Page.Cache.Add(viewStateId, this.ViewState, null, System.Web.Caching.Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(cacheTimeoutMinutes), System.Web.Caching.CacheItemPriority.Default, null);
73: }
74:
75: if (this.ControlState != null)
76: {
77: this.Page.Cache.Add(controlStateId, this.ControlState, null, System.Web.Caching.Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(cacheTimeoutMinutes), System.Web.Caching.CacheItemPriority.Default, null);
78: }
79: }
80: }
81: }