ASP.NET 2.0页面状态持续:ViewState与控件

开发 后端
本文介绍了ASP.NET 2.0页面状态持续程序的实现过程。ASP.NET 2.0 允许您修改临时保持页面状态的位置和方式。

ASP.NET 2.0页面状态持续程序

ASP.NET 控件的开发人员利用 ViewState 和控件状态来保持浏览器发出的各请求之间的状态信息。通常,该信息作为由页面呈现的 HTML 标记中的隐藏字段传送给客户端。然后,该页面状态作为下一个窗体提交的一部分传回服务器并还原给控件或页面。即使浏览器使用 HTTP 协议(该协议定义为无状态),但利用临时存储状态信息的功能,控件的开发人员能够轻松地提供更丰富的应用程序体验。

ASP.NET 2.0 允许您修改临时保持页面状态的位置和方式。在某些情况下,避免在客户端与服务器之间往返传送数据可能更为可取。ASP.NET 2.0 提供的两个页面状态持续程序分别是 HiddenFieldPageState 持续程序(我们已提到过)和 SessionPageStatePersister。SessionPageStatePersister 利用与浏览器会话相关的服务器会话存储数据。使用 SessionPageStatePersister 有正反两个方面。对于发送到(自)浏览器的页面而言,使用会话(而非隐藏字段)可以避免其大小的增加。在许多情况中,页面状态是全部标记的一个重要部分。然而,在会话中存储数据将占用宝贵的服务器资源。此外,隐藏字段不像会话那样具有相关的超时。您可以配置一个应用程序,以便将会话保持到后端数据库,并避免将负载直接加到 Web 服务器。这也将扩展至 Web 场方案。

要使用除默认持续程序之外的持续程序,需要重写该页的 PageStatePersister 属性,并返回另一个持续程序的一个实例。首先,下面的一个简单页面只使用大量数字填充一个 ArrayList,然后将它绑定到一个 GridView 控件。

  1. < !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"   
  2. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
  3. < script runat="server"> 
  4.     protected override PageStatePersister PageStatePersister {  
  5.         get {  
  6.             return new SessionPageStatePersister(this);  
  7.         }  
  8.     }  
  9.     protected override void OnLoad(EventArgs e) {  
  10.         base.OnLoad(e);  
  11.         if (!IsPostBack) {  
  12.             ArrayList list = new ArrayList();  
  13.             for (int i = 0; i <  1000; i++)  
  14.             {  
  15.                 list.Add(Convert.ToString(i));  
  16.             }  
  17.             GridView1.DataSource = list;  
  18.             GridView1.DataBind();        
  19.         }  
  20.     }  
  21. < /script> 
  22. < html  > 
  23. < head id="Head1" runat="server"> 
  24.     < title>Untitled Page< /title> 
  25. < /head> 
  26. < body> 
  27.     < form id="form1" runat="server"> 
  28.     < div> 
  29.         < asp:GridView ID="GridView1" runat="server" />          
  30.         < asp:Button ID="Button1" runat="server" Text="Submit" />< /div> 
  31.     < /form> 
  32. < /body> 
  33. < /html> 

当查看该页面所呈现的 HTML 时,您会看到一个用于传送 ViewState 的较大隐藏字段。

  1. < !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"   
  2. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
  3. < html  > 
  4. < head>< title> 
  5.    Untitled Page  
  6. < /title>< /head> 
  7. < body> 
  8.     < form name="form1" method="post" action="default2.aspx" id="form1"> 
  9. < div> 
  10. < input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE"   
  11. value="/wEPDwUKMTQ0MDQzNjk2Ng9kFgICBA9kFgICAQ88KwANAgAPFgYeC18hRGF0YUJv  
  12. dW5kZx4JUGFnZUNvdW50AgEeC18hSXRlbUNvdW50AhRkDBQrAAEWBh4EVHlwZRkrAh4ETmF  
  13. tZQUESXRlbR4JRGF0YUZpZWxkBQEhFgJmD2QWKgIBD2QWAmYPDxYCHgRUZXh0BQEwZGQCAg  
  14. 9kFgJmDw8WAh8GBQExZGQCAw9kFgJmDw8WAh8GBQEyZGQCBA9kFgJmDw8WAh8GBQEzZGQCB  
  15. Q9kFgJmDw8WAh8GBQE0ZGQCBg9kFgJmDw8WAh8GBQE1ZGQCBw9kFgJmDw8WAh8GBQE2ZGQC  
  16. CA9kFgJmDw8WAh8GBQE3ZGQCCQ9kFgJmDw8WAh8GBQE4ZGQCCg9kFgJmDw8WAh8GBQE5ZGQ  
  17. CCw9kFgJmDw8WAh8GBQIxMGRkAgwPZBYCZg8PFgIfBgUCMTFkZAIND2QWAmYPDxYCHwYFAj  
  18. EyZGQCDg9kFgJmDw8WAh8GBQIxM2RkAg8PZBYCZg8PFgIfBgUCMTRkZAIQD2QWAmYPDxYCH  
  19. wYFAjE1ZGQCEQ9kFgJmDw8WAh8GBQIxNmRkAhIPZBYCZg8PFgIfBgUCMTdkZAITD2QWAmYP  
  20. DxYCHwYFAjE4ZGQCFA9kFgJmDw8WAh8GBQIxOWRkAhUPDxYCHgdWaXNpYmxlaGRkGAEFCUd  
  21. yaWRWaWV3MQ9nZMhHZ3iQZp62S8IR8fTJ5ZL42ira" /> 
  22. < /div> 
  23. ...  

当我们向 PageStatePersister 属性添加重写并使用内置 SessionPageStatePersister 时,该页面的行为保持不变,但是用于大量状态数据的存储将从隐藏字段转换为会话状态。

  1. protected override PageStatePersister PageStatePersister  
  2. {  
  3.     get 
  4.     {  
  5.         return new SessionPageStatePersister(this);  
  6.     }  
  7. }  

请注意,在该页面的源代码中,隐藏字段值要小得多,但并没有完全消失。ASP.NET 仍将在页面输出中传送一些最小的数据集。

  1. < input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE"   
  2. value="/wEPaA8FDzhjNzkyNTMzNjE1YWEyNxgBBQlHcmlkVmlldzEPZ2QZw  
  3. 44JLJFcglwRl9TiNliE82yAuQ==" /> 

ASP.NET 2.0页面状态持续的其他方案

在某些方案中,您可能只想将与之类似的代码添加到一个较小的页面集中,因此添加与之类似的简单重写也许是可接受的。当您希望一个完整的应用程序或一个较大的页面集拥有该行为时,需要一个用于控制它的更集中化的方式。有几种方式可以实现这一点。我们可以将创建该持续程序的代码移动到从页面继承的类中:

  1. using System;  
  2. using System.Data;  
  3. using System.Configuration;  
  4. using System.Web;  
  5. using System.Web.Security;  
  6. using System.Web.UI;  
  7. using System.Web.UI.WebControls;  
  8. using System.Web.UI.WebControls.WebParts;  
  9. using System.Web.UI.HtmlControls;  
  10. public class PagePersisterBasePage : Page  
  11. {  
  12.     public PagePersisterBasePage()   {  
  13.     }  
  14.     protected override PageStatePersister PageStatePersister {  
  15.         get {  
  16.             return new SessionPageStatePersister(this);  
  17.         }  
  18.     }  
  19. }   

ASP.NET 2.0 使您能够使用“Inherits”页面指令指定页面的基类型。然后,ASP.NET 为该页面生成的代码从该基页面继承,而且无需在每个页面中复制该代码。

  1. < %@ Page Language="C#"  Inherits="PagePersisterBasePage" %> 

此外,配置选项使我们能够设置页面位置,以便所有页面使用单一的基页面类型。在该 web.config 页中,我们设置了 pageBaseType,并且无需将 Inherits 属性添加到任何页面来获取自定义的 PageStatePersister 行为。

  1. < ?xml version="1.0"?> 
  2. < configuration> 
  3.    < system.web> 
  4.     < pages pageBaseType="PagePersisterBasePage" /> 
  5.    < /system.web> 
  6. < /configuration> 

更改 PageStatePersister 并不是一件轻松的事。请仔细考虑您的应用程序和部署。尽管在隐藏字段中往返传送 ViewState 存在相关的开销,但是要将状态保持在那里,则需要有直接的服务器资源消耗。通过前面的示例您可以看到,可以插入自定义持续程序以便将状态存储在其他地方,例如,后端数据库或 Web 场共享的状态服务。此外,正如我们所演示的,您可以集中控制应用程序的行为,或者按页在页面上进行控制。

以上就是ASP.NET 2.0页面状态持续程序的实现原理。

【编辑推荐】

  1. ASP.NET 2.0数据绑定控件的自定义集合
  2. 列表控件示例:HeadlineList
  3. ASP.NET 2.0数据绑定机制:生成控件
  4. ASP.NET 2.0数据绑定的发展简述
  5. 概述ASP.NET调用Excel进程
责任编辑:yangsai 来源: MSDN
相关推荐

2009-07-28 16:42:02

ViewState技术ASP.NET应用

2009-08-04 12:29:57

ViewState概念ASP.NET

2009-07-28 13:39:44

加载ViewStateASP.NET

2009-08-04 17:00:09

ASP.NET禁用Vi

2009-07-24 17:15:52

SiteMapData

2009-07-21 15:27:12

ASP.NET 2.0

2009-08-04 17:20:37

PostBack和ViASP.NET

2009-07-20 15:19:52

ViewState本质ASP.NET

2009-08-05 15:01:04

ASP.NET应用Vi

2009-07-31 10:01:08

Button与验证控件ValidatorGr

2009-06-09 11:37:51

ViewStateViewDataASP.NET

2009-07-24 16:37:04

创建母版页asp.net 2.0

2009-08-04 13:10:05

ASP.NET服务器控

2009-08-05 17:43:48

ASP.NET 2.0

2009-07-21 15:50:47

ASP.NET控件JavaScript

2009-07-27 15:58:25

添加GridView

2009-08-04 13:39:43

ASP.NET 2.0

2009-07-20 18:02:48

GridView控件ASP.NET 2.0

2009-07-23 14:43:24

数据源控件ASP.NET 2.0

2009-07-29 09:34:54

IsPostBack属ASP.NET
点赞
收藏

51CTO技术栈公众号