首页 / 网页编程 / ASP.NET / ASP.NET 2.0的视图状态持久性机制
ASP.NET 2.0的视图状态持久性机制2010-12-10 博客园 子非鱼前言只要对ViewState稍有了解,就会知道,Asp.net页面中ViewState一般是存储 在页面的一个隐藏域中:<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value=" 一堆乱七八糟的东西">当我们浏览页面源文件时,看到的那一大堆(特别是当页面有个有大量数据 的DataGrid,或在ASP.NET2.0中的GridView时)乱七八糟的东西的时候,那就是 ViewState了。基础知识因为,在ASP.NET2.0中ViewState的持久性存储机制有了些新的变化,所以, 还是简单介绍下相关的东西。在ASP.NET1.1中,只提供了页面隐藏域的持久性机制,这样在某些情况下不 得不放弃使用ViewState,试想下,如果你的DataGrid中有上万条记录(别认为 这种变态的需要是没有的,有人就碰到过),如果启用了ViewState,你感保证 你的IIS服务器能承受得住吗,网络承受得主吗?当然你是可以通过重写 Page.SavePageStateToPersistenceMedium()方法来更改你的存储机制,但别忘 了重写Page.LoadPageStateFromPersistenceMedium(),它们可是一对的啊。ASP.NET2.0 中的默认视图状态持久性机制依然是在页上的一个隐藏 HTML 元 素(一个 type 属性设置为 "hidden" 的元素)中将状态信息保留为一个 Base64 编码的字符串。ASP.NET 页使用 HiddenFieldPageStatePersister 对象 执行此项工作,并使用一个 IStateFormatter 实例对对象状态信息进行序列化 和反序列化。或者,对于带宽和资源有限的移动客户端,您也可以使用 SessionPageStatePersister 类在服务器上的 Session 对象中存储页的视图状 态,其实也就多了个Session持久机制而已,让我们把页面状态保存在Session中 ,而不是页面中,这对带宽是一种节省。但你要深入的了解ViewState持久机制的话,抽象类PageStatePersister你是 应该去了解的,要在不能支持现有视图状态持久性机制的客户端上保留视图状态 ,可以扩展 PageStatePersister 类,引入您自己的视图状态持久性方法,并且 可以使用页适配器将 ASP.NET 应用程序配置为根据为其提供页的客户端的类型 使用不同的视图状态持久性机制。从 PageStatePersister 类派生的类必须重写 Save 抽象方法,以便在持久性介质中存储视图状态和控件状态,同时重写 Load 方法以提取状态信息。如果需要将视图状态和控件状态序列化为字符串,可以使 用通过 StateFormatter 属性来访问的 IStateFormatter 对象。它可以高效地 将对象状态信息序列化和反序列化为 Base64 编码字符串。还可以重写 StateFormatter 属性以提供自己的对象状态序列化机制,如何为之,我的代码 中都有介绍,很简单,看看就明白了。ViewState持久性机制隐藏域这个就不介绍了,默认的就是这种。就入前言中的那样。Session在ASP.NET2.0中只要重写PageStatePersister属性就可以了。protected override PageStatePersister PageStatePersister
{
get
{
return new SessionPageStatePersister(Page);
}
}要是在ASP.NET1.1中需要重写LoadPageStateFromPersistenceMedium这两个 方法:protected override object LoadPageStateFromPersistenceMedium ()
{
return Session["ViewState"];
}
protected override void SavePageStateToPersistenceMedium(object viewState)
{
Session["ViewState"] = viewState;
RegisterHiddenField("__VIEWSTATE", "");
}