{S0}简介
ASP.NET ViewState是一个伟大的机制,简化的ASP.NET开发人员的生活。但是,大家都知道,在。NET Framework节省您的ASPX页面上作为隐藏字段的ViewState数据。如果您的网页只有少数控制,这是没有问题的。但是,如果你的页面有一些面板和/或一些DataGrid中,在这篇文章中表现出的技术,,你可以大大减少页面加载时间。
我们将开始我们的分析思维框架需要的地方工作的ViewState隐藏字段保存的数据。答案是:只有在服务器端。该系统并不需要工作在客户端的ViewState数据,因此,如果我们开始这一数据再次保存,而不是从服务器到客户端在进行这一切,从客户机到服务器的服务器,我们而载入我们的文件,将节省大量的时间。你可能不会注意的差异,而同一台计算机上安装该应用程序加载的页面,但是,使用拨号连接来测试它,你会看到发生什么事。你冷也看到了与没有这种技术生成的源代码的大小。
这个例子包含一个类继承的System.Web.UI.Page,并覆盖方法SavePageStateToPersistenceMedium和LoadPageStateFromPersistenceMedium。这些方法负责保存和加载页面上的控件使用ViewState的。我们做的是拦截调用这些方法,使用Web.config中一些简单的自定义配置项,设置这个类应该是如何工作的。它可以使用两个目的地的服务器上保存的ViewState:会话和缓存,并有工作能力的原始类,节能的ASPX页面的ViewState数据。
如果你已经有一个项目要开始使用这种技术,所有你需要做的是添加一个引用,伴随着这个例子的类和继承您的"代码隐藏文件",而不是系统。 Web.UI.Page,并添加到Web.config配置信息。
为了开发这种技术,我读了很多在互联网上的文章,但是,一个真正的"打开我的心"如何做这个实现可以和它的好处。见利益节点数的详细信息。
我包括一个演示项目,你可以下载和使用测试执行。需要注意的是示范项目的会议上,我认为这是最好的地方来存储它的ViewState保存。使用代码
正如我所说的,实施是很容易的。所以,让我们开始与我的类的代码,并讨论后,让我们看到的Web.config文件的配置。"ASPX页面的ViewState"作者:Rgis丹尼尔德奥利韦拉。"电子邮箱:regisxp@hotmail.com"日期..:07/2005"Reserach来源:"http://www.eggheadcafe.com/articles/20040613.asp进口System.Configuration.ConfigurationSettings进口System.Diagnostics公共类VSPage 继承的System.Web.UI.Page
现在,让我们来看看负责保存ViewState数据,称为SavePageStateToPersistenceMedium的方法。 ,这种方法是,如果我们的web.config文件ServerSideViewState是启用(true)。如果没有,系统将执行一个正常的ViewState保存,其存储的ASPX文件。如果有的话,系统会检查这是ServerSideViewState方法要使用高速缓存或会话。如果您选择的CACHE,将数据存储在缓存,并将于一段时间后,。如果您选择会话,数据将被保存在用户会话和用户会话到期时,将被丢弃。使用此选项时,系统会自动创建一个DataTable的会议上,将保留所有的ViewState数据将被保存。 ViewState数据,可在DataTable中举行的最大数量是指在Web.Config参数ViewStateTableSize。默认值为150,代表,过去的150回传的ViewState数据将提供给系统。因此,如果用户点击导航器的后退按钮的150倍(什么是不可能发生的),该页面的ViewState将已经存在要使用。这是一个很好的的数字... ...受保护的覆盖子_
0;SavePageStateToPersistenceMedium(#对象的ViewState)
0; 作为字符串昏暗的VSKey '字符串,将举行的唯一键 "用于引用这个ViewState数据 Debug.WriteLine(MyBase.Session.SessionID) "创建基础上的SessionID的关键,对Request.RawUrl
160; "和上的确切时间representated蜱
"而被保存在页面 VSKey ="VIEWSTATE_quot;放大器,MyBase.Session.SessionID放大器;"_quot;放大器; - Request.RawUrl放大器;"_quot;放大器; Date.Now.Ticks.ToString
160; "检查,如果ServerSideViewState被激活
160; 如果UCASE(的AppSettings("ServerSideViewStatequot;))="; TRUEquot",然后
"检查,我们将保存ViewState数据
60; 如果UCASE(的AppSettings("ViewStateStorequot;))="; CACHEquot",然后
60; "存储在缓存中的ViewState
160; Cache.Add(VSKey,ViewState的,没什么,_
Date.Now.AddMinutes(Session.Timeout),_ &
#160; Cache.NoSlidingExpiration,
0; Web.Caching.CacheItemPriority.Default,没什么) "ViewStateData本届会议将被保存
0; 其他
由于DataTable中的DIM VsDataTable
60; 作为DataRow的DIM DbRow &
#160; "检查的ViewState的DataTable会议
如果然后IsNothing(会议("; __VSDataTablequot";))
60; "不,不是这样的。创建它...
DIM PkColumn(1),DbColumn的DataColumn
0; VsDataTable =新的DataTable("VStatequot;)
0; '创建的DataTable
; "列1 - 名称:VSKey - 的PrimaryKey
DbColumn =新的DataColumn("; VSKeyquot";的GetType(字符串))
160; VsDataTable.Columns.Add(DbColumn)
0; PkColumn(0)= DbColumn
0; VsDataTable.PrimaryKey = PkColumn
60;"列2 - 名称:ViewStateData
0; DbColumn =新的DataColumn("VSDataquot;对象的GetType())
0; VsDataTable.Columns.Add(DbColumn)
"列3 - 名称:日期时间
DbColumn =新的DataColumn("DateTimequot;,的GetType(日期))
160;VsDataTable.Columns.Add(DbColumn)
0; 其他
; "ViewState的数据表已经上UserSession
;会议VsDataTable =("__VSDataTablequot;)
结束如果
160; "检查,如果我们已经使用相同的密钥保存的ViewState。
60;"如果有的话,更新,而不是创建一个新行。
60; "(这是非常dificult发生)
160; VsDataTable.Rows.Find DbRow =(VSKey)
; 如果不IsNothing(DbRow)
0; "行!!创建一个新的更新,而不是...
160;DbRow("VsDataquot;)= ViewState中 &
#160; 其他
160; "创建一个新行...
DbRow = VsDataTable.NewRow
; DbRow("VSKeyquot;)= VSKey
; DbRow("VsDataquot;)= ViewState中
0; DbRow("DateTimequot;)= Date.Now
0; VsDataTable.Rows.Add(DbRow)
; 结束如果 &
#160; "检查,如果我们的DataTable是超大...
60; 如果Convert.ToInt16(的AppSettings("; ViewStateTableSizequot";))_ &
#160; 然后LT; VsDataTable.Rows.Count
0; Debug.WriteLine("删除的ViewState在quot; -
160; 放大器; DbRow(2)放大器",编号quot;放大器; DbRow(0))
60; VsDataTable.Rows(0),删除()'删除第一行。 &
#160; 结束如果
60; "存储在会话的DataTable。 &
#160; 会议("__VSDataTablequot;)= VsDataTable 结束如果
0; "注册页面上的一个HiddenField,
160; "包含UniqueKey产生。
160;"有了这个,我们将能够找到的ViewState
160; "从这个网页,通过检索这些值。
60; RegisterHiddenField("; __VIEWSTATE_KEYquot";,VSKey)
其他 "通话的正常进程。 MyBase.SavePageStateToPersistenceMedium(视图状态) 结束如果
END SUB
现在,让我们来看看负责的方法来加载ViewStateData,LoadPageStateFromPersistenceMedium:保护覆盖功能LoadPageStateFromPersistenceMedium()作为对象 &
#160; "Verifica SE Ø ServerSideViewState EST??ativado 如果UCASE(的AppSettings("ServerSideViewStatequot;))="; TRUEquot",然后
60; DIM VSKey作为字符串'的ViewState UniqueKey &
#160; VSKey =的Request.Form("__VIEWSTATE_KEYquot;) "请求页面的重点和validade。
0; 如果没有VSKey.StartsWith("VIEWSTATE_quot;)
160; 抛出新的异常("无效VIEWSTATE重点:"放大器; VSKey)
60; 结束如果
; "验证现在,这是我们需要对我们的配置文件web.config:LT插入; - 应用程序特定的设置 - >! LT; appSettingsgt; LT; - ServerSideViewState:定义如果的ViewState
将被保存在服务器上:真| FALSE - GT; LT;添加键="ServerSideViewStatequot;值= quot; Truequot; / GT; !LT - ViewStateStore:定义,我们将保存在ViewState:缓存|会议 - GT; LT;添加键="ViewStateStorequot;值= quot; Sessionquot; / GT; LT; - ViewStateCacheFSSize:定义的最大数量 &
#160; viewStates将被保存时ViewStateStore =会议 - GT;
60; LT;添加键="ViewStateTableSizequot;值= quot; 150quot; / GT; LT; / appSettingsgt;兴趣点
大量的研究是为了实现本文提出的登录。最有趣的来源之一。如果您想了解有关这些技术的更多信息,看到一些压力测试的结果,按照链接。结论
ViewState的真正简化的ASP.NET应用程序的发展,但由于在页面加载时间增加,一些开发商不喜欢使用它。利用这种技术,你可以使用在您的项目没有对生成的页面源代码的大小担心的ViewState的所有优势。