当前位置:首页 > 网络编程 > WEB编程 > ASP.net >  ASP.NET 2.0的视图状态持久性机制2

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

点击次数:20 次 发布日期:2008-11-26 11:21:32 作者:源代码网
源代码网推荐      namespace PageAdapter
源代码网推荐  {
源代码网推荐  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)。
源代码网推荐


源代码网供稿.
网友评论 (0)
会员中心
网络编程
本站推荐
网络编程之精华