ASP.NET 2.0的视图状态持久性机制
文件
这其实也跟数据库的差不了多少,我这只讲ASP.net2.0的,在ASP.NET1.1也应该差不多,但我没有写代码调试:
还是用那种写PageStatePersister新子类的办法:
使用页适配器
由于状态持久性机制与自适应呈现和客户端功能有关,因此提供MyPageAdapter激活 ASP.NET 应用程序的 DatabasePageStatePersister。最后,提供了一个浏览器功能 (.browser) 文件来为特定类别的客户端(在此例中为默认 Web 浏览器)启用 MyPageAdapter器。
这些内容请具体看我提供的源码中的PageAdapter工程。看了就明白了。
结束语
说得比较简单,可能也不是很明白,至于各种持久机制的优劣,我也没有专门测试过,而且最后一条“使用页适配器”也不是属于持久机制,只是用了也适配器,我们就不要重写PageStatePersister属性了,我看来好像用处不是很大,因为我们可以把重写PageStatePersister的动作放在页面基类中,其它所有页面都继承这个基类就可以了,在我代码中就是这么做的,用这个页适配器还麻烦了,当然我也并太清楚页适配器的这个东东。
这其实也跟数据库的差不了多少,我这只讲ASP.net2.0的,在ASP.NET1.1也应该差不多,但我没有写代码调试:
还是用那种写PageStatePersister新子类的办法:
再重写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;
}
}
}
通过上面的简单介绍,我们应该有所了解了,只是要明白的是:在ASP.NET1.1中我们只能通过重写age.SavePageStateToPersistenceMedium()和Page.LoadPageStateFromPersistenceMedium()来完成上述功能;而在ASP.NET2.0中,我们除了这外,还和通过写PageStatePersister新子类和重写PageStatePersister属性来完成,我是没有发现什么不同,当然如果在下面的内容你就明白,写PageStatePersister新子类的真正用处了。protected override PageStatePersister PageStatePersister
...{
get
...{
return new StreamPageStatePersister (Page);
![]()
}
使用页适配器
由于状态持久性机制与自适应呈现和客户端功能有关,因此提供MyPageAdapter激活 ASP.NET 应用程序的 DatabasePageStatePersister。最后,提供了一个浏览器功能 (.browser) 文件来为特定类别的客户端(在此例中为默认 Web 浏览器)启用 MyPageAdapter器。
这些内容请具体看我提供的源码中的PageAdapter工程。看了就明白了。
最后,为了启用 MyPageAdapter 适配器,您必须在 ASP.NET 应用程序的根目录下创建一个名为 App_Browsers 的目录,并在其中包括一个包含配置信息的 .browser 文件(其实这些都在你向工程中添加一个.browser文件时vs2005会自动给你完成的。配置文件中的 <refID元素指示该配置重写为 Default.browser 配置文件中的默认浏览器指定的值。此示例将 MyPageAdapter 用于 ASP.NET 网页(但通常不使用适配器)。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);
}
}
}
这可以看源码中的TestPageAdapter工程。该工程用来演示页适配器的。<browsers>
<browser refID="Default" >
<controlAdapters>
<adapter
controlType="System.Web.UI.Page"
adapterType="PageAdapter.MyPageAdapter" />
</controlAdapters>
</browser>
</browsers>
结束语
说得比较简单,可能也不是很明白,至于各种持久机制的优劣,我也没有专门测试过,而且最后一条“使用页适配器”也不是属于持久机制,只是用了也适配器,我们就不要重写PageStatePersister属性了,我看来好像用处不是很大,因为我们可以把重写PageStatePersister的动作放在页面基类中,其它所有页面都继承这个基类就可以了,在我代码中就是这么做的,用这个页适配器还麻烦了,当然我也并太清楚页适配器的这个东东。
0
相关文章
