ASP.NET 2.0的视图状态持久性机制2
点击次数:20 次 发布日期:2008-11-26 11:21:32 作者:源代码网
|
源代码网推荐 { 源代码网推荐 using System; 源代码网推荐 using System.IO; 源代码网推荐 using System.Security.Permissions; 源代码网推荐 using System.Web; 源代码网推荐 using System.Web.UI; 源代码网推荐 源代码网推荐 [AspNetHostingPermission(SecurityAction.Demand, Level = AspNetHostingPermissionLevel.Minimal)] 源代码网推荐 源代码网推荐 public class DatabasePageStatePersister : PageStatePersister 源代码网推荐 { 源代码网推荐 public DatabasePageStatePersister(Page page): base(page) 源代码网推荐 {} 源代码网推荐 // 源代码网推荐 // Load ViewState and ControlState. 源代码网推荐 // 源代码网推荐 public override void Load() 源代码网推荐 { 源代码网推荐 string viewState; 源代码网推荐 IStateFormatter formatter = this.StateFormatter; 源代码网推荐 DataAccess da = new DataAccess(); 源代码网推荐 string stateID = base.Page.Request["__VIEWSTATE_KEY"].ToString(); 源代码网推荐 viewState = da.LoadViewState(stateID); 源代码网推荐 Pair statePair = (Pair)formatter.Deserialize(viewState); 源代码网推荐 ViewState = statePair.First; 源代码网推荐 ControlState = statePair.Second; 源代码网推荐 } 源代码网推荐 // 源代码网推荐 // Persist any ViewState and ControlState. 源代码网推荐 // 源代码网推荐 public override void Save() 源代码网推荐 { 源代码网推荐 if (ViewState != null || ControlState != null) 源代码网推荐 { 源代码网推荐 if (Page.Session != null) 源代码网推荐 { 源代码网推荐 string viewStateID = "VIEWSTATE#" + base.Page.Session.SessionID.ToString() + "#" + DateTime.Now.Ticks.ToString(); 源代码网推荐 base.Page.ClientScript.RegisterHiddenField("__VIEWSTATE_KEY", viewStateID); 源代码网推荐 Pair statePair = new Pair(ViewState, ControlState); 源代码网推荐 IStateFormatter formatter = this.StateFormatter; 源代码网推荐 // Serialize the statePair object to a string. 源代码网推荐 源代码网推荐 string serializedState = formatter.Serialize(statePair); 源代码网推荐 ViewStateData vsd = new ViewStateData(); 源代码网推荐 vsd.ViewStateID = viewStateID; 源代码网推荐 vsd.ViewState = serializedState; 源代码网推荐 DataAccess da = new DataAccess(); 源代码网推荐 string error = da.SaveViewState(vsd); 源代码网推荐 } 源代码网推荐 else 源代码网推荐 throw new InvalidOperationException("Session needed for StreamPageStatePersister."); 源代码网推荐 } 源代码网推荐 } 源代码网推荐 } 源代码网推荐 源代码网推荐 } 源代码网推荐 源代码网推荐 再有重写PageStatePersister属性就可以了: 源代码网推荐 源代码网推荐 protected override PageStatePersister PageStatePersister 源代码网推荐 { 源代码网推荐 get 源代码网推荐 { 源代码网推荐 return new DatabasePageStatePersister(Page); 源代码网推荐 } 源代码网推荐 文件 源代码网推荐 源代码网推荐 这其实也跟数据库的差不了多少,我这只讲ASP.NET2.0的,在ASP.NET1.1也应该差不多,但我没有写代码调试: 源代码网推荐 源代码网推荐 还是用那种写PageStatePersister新子类的办法: 源代码网推荐 源代码网推荐 namespace StreamPageAdapter 源代码网推荐 { 源代码网推荐 using System; 源代码网推荐 using System.IO; 源代码网推荐 using System.Security.Permissions; 源代码网推荐 using System.Web; 源代码网推荐 using System.Web.UI; 源代码网推荐 源代码网推荐 // 源代码网推荐 // The StreamPageStatePersister is an example view state 源代码网推荐 // persistence mechanism that persists view and control 源代码网推荐 // state on the Web server. 源代码网推荐 // 源代码网推荐 源代码网推荐 [AspNetHostingPermission(SecurityAction.Demand, Level = AspNetHostingPermissionLevel.Minimal)] 源代码网推荐 源代码网推荐 public class StreamPageStatePersister : PageStatePersister 源代码网推荐 { 源代码网推荐 public StreamPageStatePersister(Page page): base(page) 源代码网推荐 {} 源代码网推荐 // 源代码网推荐 // Load ViewState and ControlState. 源代码网推荐 // 源代码网推荐 源代码网推荐 public override void Load() 源代码网推荐 { 源代码网推荐 Stream stateStream = GetSecureStream(); 源代码网推荐 // Read the state string, using the StateFormatter. 源代码网推荐 StreamReader reader = new StreamReader(stateStream); 源代码网推荐 IStateFormatter formatter = this.StateFormatter; 源代码网推荐 string fileContents = reader.ReadToEnd(); 源代码网推荐 // Deserilize returns the Pair object that is serialized in 源代码网推荐 // the Save method. 源代码网推荐 Pair statePair = (Pair)formatter.Deserialize(fileContents); 源代码网推荐 ViewState = statePair.First; 源代码网推荐 ControlState = statePair.Second; 源代码网推荐 reader.Close(); 源代码网推荐 stateStream.Close(); 源代码网推荐 } 源代码网推荐 // 源代码网推荐 // Persist any ViewState and ControlState. 源代码网推荐 // 源代码网推荐 源代码网推荐 public override void Save() 源代码网推荐 { 源代码网推荐 if (ViewState != null || ControlState != null) 源代码网推荐 { 源代码网推荐 if (Page.Session != null) 源代码网推荐 { 源代码网推荐 Stream stateStream = GetSecureStream(); 源代码网推荐 StreamWriter writer = new StreamWriter(stateStream); 源代码网推荐 IStateFormatter formatter = this.StateFormatter; 源代码网推荐 Pair statePair = new Pair(ViewState, ControlState); 源代码网推荐 源代码网推荐 // Serialize the statePair object to a string. 源代码网推荐 string serializedState = formatter.Serialize(statePair); 源代码网推荐 writer.Write(serializedState); 源代码网推荐 writer.Close(); 源代码网推荐 stateStream.Close(); 源代码网推荐 } 源代码网推荐 else 源代码网推荐 throw new InvalidOperationException("Session needed for StreamPageStatePersister."); 源代码网推荐 } 源代码网推荐 } 源代码网推荐 源代码网推荐 // Return a secure Stream for your environment. 源代码网推荐 源代码网推荐 private Stream GetSecureStream() 源代码网推荐 { 源代码网推荐 string path = @"d:a.txt"; 源代码网推荐 FileStream fs = new FileStream(path, FileMode.Open, FileAccess.ReadWrite); 源代码网推荐 return fs; 源代码网推荐 } 源代码网推荐 } 源代码网推荐 } 源代码网推荐 源代码网推荐 再重写PageStatePersister属性就可以了: 源代码网推荐 源代码网推荐 protected override PageStatePersister PageStatePersister 源代码网推荐 { 源代码网推荐 get 源代码网推荐 { 源代码网推荐 return new StreamPageStatePersister (Page); 源代码网推荐 源代码网推荐 } 源代码网推荐 源代码网推荐 源代码网推荐 通过上面的简单介绍,我们应该有所了解了,只是要明白的是:在ASP.NET1.1中我们只能通过重写age.SavePageStateToPersistenceMedium()和Page.LoadPageStateFromPersistenceMedium()来完成上述功能;而在ASP.NET2.0中,我们除了这外,还和通过写PageStatePersister新子类和重写PageStatePersister属性来完成,我是没有发现什么不同,当然如果在下面的内容你就明白,写PageStatePersister新子类的真正用处了。 源代码网推荐 源代码网推荐 使用页适配器 源代码网推荐 源代码网推荐 由于状态持久性机制与自适应呈现和客户端功能有关,因此提供MyPageAdapter激活 ASP.NET 应用程序的 DatabasePageStatePersister。最后,提供了一个浏览器功能 (.browser) 文件来为特定类别的客户端(在此例中为默认 Web 浏览器)启用 MyPageAdapter器。 源代码网推荐 源代码网推荐 这些内容请具体看我提供的源码中的PageAdapter工程。看了就明白了。 源代码网推荐 源代码网推荐 using System.Security.Permissions; 源代码网推荐 using System.Web; 源代码网推荐 using System.Web.UI; 源代码网推荐 源代码网推荐 namespace PageAdapter 源代码网推荐 { 源代码网推荐 [AspNetHostingPermission(SecurityAction.Demand, Level = AspNetHostingPermissionLevel.Minimal)] 源代码网推荐 public class MyPageAdapter : System.Web.UI.Adapters.PageAdapter 源代码网推荐 { 源代码网推荐 public override PageStatePersister GetStatePersister() 源代码网推荐 { 源代码网推荐 return new PageAdapter.DatabasePageStatePersister(Page); 源代码网推荐 } 源代码网推荐 } 源代码网推荐 } 源代码网推荐 源代码网推荐 最后,为了启用 MyPageAdapter 适配器,您必须在 ASP.NET 应用程序的根目录下创建一个名为 App_Browsers 的目录,并在其中包括一个包含配置信息的 .browser 文件(其实这些都在你向工程中添加一个.browser文件时vs2005会自动给你完成的。配置文件中的 <refID元素指示该配置重写为 Default.browser 配置文件中的默认浏览器指定的值。此示例将 MyPageAdapter 用于 ASP.NET 网页(但通常不使用适配器)。 源代码网推荐 源代码网推荐 <browsers> 源代码网推荐 <browser refID="Default" > 源代码网推荐 <controlAdapters> 源代码网推荐 <adapter 源代码网推荐 controlType="System.Web.UI.Page" 源代码网推荐 adapterType="PageAdapter.MyPageAdapter" /> 源代码网推荐 </controlAdapters> 源代码网推荐 </browser> 源代码网推荐 </browsers> 源代码网推荐 源代码网推荐 源代码网推荐 这可以看源码中的TestPageAdapter工程。该工程用来演示页适配器的。 源代码网推荐 源代码网推荐 结束语 源代码网推荐 源代码网推荐 说得比较简单,可能也不是很明白,至于各种持久机制的优劣,我也没有专门测试过,而且最后一条“使用页适配器”也不是属于持久机制,只是用了也适配器,我们就不要重写 源代码网推荐 源代码网推荐 PageStatePersister属性了,我看来好像用处不是很大,因为我们可以把重写PageStatePersister的动作放在页面基类中,其它所有页面都继承这个基类就可以了,在我代码中就是这么做的,用这个页适配器还麻烦了,当然我也并太清楚页适配器的这个东东。 源代码网推荐 源代码网推荐 另外,对我的源码做个简单说明: 源代码网推荐 源代码网推荐 1. PageAdapter工程 源代码网推荐 源代码网推荐 DatabasePageStatePersister.cs:PageStatePersister类的子类 源代码网推荐 MyPageAdapter.cs:页适配器 源代码网推荐 DataAccess.cs和ViewSate.cs数据库访问的,属于辅助类。 源代码网推荐 源代码网推荐 2. StreamPageAdapter工程 源代码网推荐 源代码网推荐 这个与上面的相似,不多说了 源代码网推荐 源代码网推荐 3. SaveStateToDatabase工程 源代码网推荐 源代码网推荐 StateInHiddenField.aspx:测试默认的存储机制,就是在看页面源文件时可以看到一大堆乱七八糟东西的。 源代码网推荐 源代码网推荐 StateInSession.aspx:存储机制为Session 源代码网推荐 源代码网推荐 StateInDatabase.aspx:存储机制数据库,是重写方法的那种,asp.net1.1,2.0都可以用的。 源代码网推荐 源代码网推荐 StateInDatabase2.aspx:写PageStatePersister新子类的并重写PageStatePersister属性的那种 源代码网推荐 源代码网推荐 StateInFile.aspx:把ViewState保存在服务器中某个文件夹中。 源代码网推荐 源代码网推荐 4. TestPageAdater工程。 源代码网推荐 源代码网推荐 用来测试也适配器用的。 源代码网推荐 做人要厚道,请注明转自酷网动力(www.ASPCOOL.COM)。 源代码网推荐 源代码网供稿. |
