ASP.NET 2.0的视图状态持久性机制1
点击次数:33 次 发布日期:2008-11-26 11:21:34 作者:源代码网
|
源代码网推荐 源代码网推荐 只要对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", ""); 源代码网推荐 } 源代码网推荐 源代码网推荐 数据库(我的示例是SQL Server2000) 源代码网推荐 源代码网推荐 在ASP1.1中,请注意下面紫色的那行,我也不太清楚那有什么用,它让我郁闷了好几天,等下你就明白我的郁闷了。还有下面的代码只是凑我的源码中拷贝出来的,你完全可以不这样写的,除了那些必要的外。 源代码网推荐 源代码网推荐 protected override void SavePageStateToPersistenceMedium(object state) 源代码网推荐 { 源代码网推荐 string viewStateID = "VIEWSTATE#" + Session.SessionID.ToString() + "#" + DateTime.Now.Ticks.ToString(); 源代码网推荐 ClientScript.RegisterHiddenField("__VIEWSTATE_KEY", viewStateID); 源代码网推荐 ClientScript.RegisterHiddenField("__VIEWSTATE","");//请注意 源代码网推荐 源代码网推荐 try 源代码网推荐 { 源代码网推荐 if (losFormatter == null) 源代码网推荐 { 源代码网推荐 losFormatter = new LosFormatter(); 源代码网推荐 } 源代码网推荐 StringWriter sw = new StringWriter(); 源代码网推荐 losFormatter.Serialize(sw, state); 源代码网推荐 Common.ViewStateData vsd = new ViewStateData(); 源代码网推荐 vsd.ViewStateID = viewStateID; 源代码网推荐 vsd.ViewState = sw.ToString(); 源代码网推荐 da = new DataAccess(); 源代码网推荐 string error = da.SaveViewState(vsd); 源代码网推荐 Response.Write(error); 源代码网推荐 } 源代码网推荐 catch (Exception ex) 源代码网推荐 { 源代码网推荐 Response.Write(ex.Message); 源代码网推荐 } 源代码网推荐 } 源代码网推荐 源代码网推荐 protected override object LoadPageStateFromPersistenceMedium() 源代码网推荐 { 源代码网推荐 string viewState = string.Empty; 源代码网推荐 try 源代码网推荐 { 源代码网推荐 if (losFormatter == null) 源代码网推荐 { 源代码网推荐 losFormatter = new LosFormatter(); 源代码网推荐 } 源代码网推荐 string stateID = Page.Request["__VIEWSTATE_KEY"].ToString(); 源代码网推荐 da = new DataAccess(); 源代码网推荐 viewState = da.LoadViewState(stateID); 源代码网推荐 } 源代码网推荐 catch 源代码网推荐 {} 源代码网推荐 源代码网推荐 return losFormatter.Deserialize(viewState); 源代码网推荐 } 源代码网推荐 源代码网推荐 在ASP2.0中这行代码基本是可以的,为什么是基本呢,因为就是上面那行 ClientScript.RegisterHiddenField("__VIEWSTATE",""); 源代码网推荐 源代码网推荐 有没有这行,在Asp.net1.1中都是可行的,我也是参考过别人的代码,这行就这么加入了,加了这行后,只是在页面中多了个 源代码网推荐 源代码网推荐 <input type="hidden" name="__VIEWSTATE" value="" /> 源代码网推荐 源代码网推荐 也就是运行后页面的源文件中有两个这样的东西。去掉那行也可以,所以我不明白语句是用做什么的,请明白的告诉我吧。但是在Asp.net2.0中就不行,有如下错误: 源代码网推荐 源代码网推荐 The state information is invalid for this page and might be corrupted. 源代码网推荐 源代码网推荐 反正当时就是晕晕的,我以前从来没有碰到过如是错误,去google也无所得,是啊,打死我也不知道是那句错了啊,就这么郁闷了两天,问题无法解决,本人天生愚钝的,我跟踪视图状态的存入数据库与从数据库的读取的整个过程,硬是找不到错误,我就反复思考这些代码,惟有那行,我就是有点迷惑,为什么还要页面注册一个“__VIEWSTATE”的隐藏域呢,于是我就注释掉这行,居然可以运行了,所以我还是不明白那行是什么用意。 源代码网推荐 源代码网推荐 当然我们还可以通过写一个PageStatePersister新子类也可以完成上述功能,这是ASP.NET2.0新增的: 源代码网推荐 源代码网推荐 源代码网推荐 做人要厚道,请注明转自酷网动力(www.ASPCOOL.COM)。 源代码网推荐 源代码网供稿. |
