技术开发 频道

ASP.NET 2.0的视图状态持久性机制

    文件

    这其实也跟数据库的差不了多少,我这只讲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的动作放在页面基类中,其它所有页面都继承这个基类就可以了,在我代码中就是这么做的,用这个页适配器还麻烦了,当然我也并太清楚页适配器的这个东东。
0
相关文章