如何將ViewState持久化
如果你有一個非常酷的頁面,頁面上很多東西自動地響應用戶操作而展現豐富的變化,你的ViewState是很有可能達到200K的。
這里是我將ViewState持久化保持在服務器端的代碼,這樣ViewState不占用網絡帶寬,因此其存取只是服務器的磁盤讀取時間。并且它很小,可以說是磁盤隨便轉一圈就能同時讀取好多ViewState,因此可以說“不占時間”。為了再“不占磁盤時間”,我還使用了緩存。
一下這段代碼可以放在頁面中,或者頁面的父類中:
ViewState持久化C# code
- protected override object LoadPageStateFromPersistenceMedium()
- {
- var viewStateID = (string)((Pair)base.LoadPageStateFromPersistenceMedium()).Second;
- var stateStr = (string)Cache[viewStateID];
- if (stateStr == null)
- {
- var fn = Path.Combine(this.Request.PhysicalApplicationPath, @"App_Data/ViewState/" + viewStateID);
- stateStr = File.ReadAllText(fn);
- }
- return new ObjectStateFormatter().Deserialize(stateStr);
- }
- protected override void SavePageStateToPersistenceMedium(object state)
- {
- var value = new ObjectStateFormatter().Serialize(state);
- var viewStateID = (DateTime.Now.Ticks + (long)this.GetHashCode()).ToString(); //產生離散的id號碼
- var fn = Path.Combine(this.Request.PhysicalApplicationPath, @"App_Data/ViewState/" + viewStateID);
- ThreadPool.QueueUserWorkItem(obj => File.WriteAllText(fn, value));
- Cache.Insert(viewStateID, value);
- base.SavePageStateToPersistenceMedium(viewStateID);
- }
不使用Session,因為它會“丟失”。ViewState保存在磁盤上,即使服務器重新啟動,也不會丟失頁面狀態。
下面這段可以放在Global.asax中,也可以根本不管:
ViewState持久化C# code
- protected void Application_Start(object sender, EventArgs e)
- {
- var dir = new DirectoryInfo(this.Server.MapPath("~/App_Data/ViewState/"));
- if (!dir.Exists)
- dir.Create();
- else
- {
- var nt = DateTime.Now.AddHours(-1);
- dir.GetFiles().ForEach(f =>
- {
- if (f.CreationTime < nt)
- f.Delete();
- });
- }
- }
這可以確保絕對穩定可靠地工作。以后請放心使用ViewState,把交互式頁面提高水平才是最重要的,不要糾纏在“ViewState太大”上。實際上,由于頁面設計不夠酷,交互變化看上去不夠豐富,ViewState實在是太小太小了。
如果你使用了它有效提高了復雜交互頁面的效率,可以說一下提高了多少?!如果你覺得沒用,也可以說一下在什么情況下沒用。
【編輯推薦】