科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件ASP.NET 2.0的视图状态持久性机制

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

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

ASP.NET2.0 中的默认视图状态持久性机制依然是在页上的一个隐藏 HTML 元素中将状态信息保留为一个 Base64 编码的字符串。

作者:子非鱼 来源:博客园 2007年11月6日

关键字: Windows

  • 评论
  • 分享微博
  • 分享邮件
文件

  这其实也跟数据库的差不了多少,我这只讲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工程。

  用来测试也适配器用的。

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章