打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
ASP.NET 2.0页面状态持续:ViewState与控件 - 51CTO.COM
    本文介绍了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页面状态持续程序的实现原理。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
ViewState与Session
ASP.NET:掌握Web窗体的生命周期与状态管理
ASP.NET页面——视图状态
缓存技术
ASP.NET状态管理的总结
介绍缓存的基本概念和常用的缓存技术
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服