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

asp.net|程序|页面

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

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

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

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
    protected override PageStatePersister PageStatePersister {
        get {
            return new SessionPageStatePersister(this);
        }
    }
    protected override void OnLoad(EventArgs e) {
        base.OnLoad(e);
        if (!IsPostBack) {
            ArrayList list = new ArrayList();
            for (int i = 0; i < 1000; i++)
            {
                list.Add(Convert.ToString(i));
            }
            GridView1.DataSource = list;
            GridView1.DataBind();     
        }
    }
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:GridView ID="GridView1" runat="server" />       
        <asp:Button ID="Button1" runat="server" Text="Submit" /></div>
    </form>
</body>
</html>

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

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head><title>
   Untitled Page
</title></head>
<body>
    <form name="form1" method="post" action="default2.aspx" id="form1">
<div>
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE"
value="/wEPDwUKMTQ0MDQzNjk2Ng9kFgICBA9kFgICAQ88KwANAgAPFgYeC18hRGF0YUJv
dW5kZx4JUGFnZUNvdW50AgEeC18hSXRlbUNvdW50AhRkDBQrAAEWBh4EVHlwZRkrAh4ETmF
tZQUESXRlbR4JRGF0YUZpZWxkBQEhFgJmD2QWKgIBD2QWAmYPDxYCHgRUZXh0BQEwZGQCAg
9kFgJmDw8WAh8GBQExZGQCAw9kFgJmDw8WAh8GBQEyZGQCBA9kFgJmDw8WAh8GBQEzZGQCB
Q9kFgJmDw8WAh8GBQE0ZGQCBg9kFgJmDw8WAh8GBQE1ZGQCBw9kFgJmDw8WAh8GBQE2ZGQC
CA9kFgJmDw8WAh8GBQE3ZGQCCQ9kFgJmDw8WAh8GBQE4ZGQCCg9kFgJmDw8WAh8GBQE5ZGQ
CCw9kFgJmDw8WAh8GBQIxMGRkAgwPZBYCZg8PFgIfBgUCMTFkZAIND2QWAmYPDxYCHwYFAj
EyZGQCDg9kFgJmDw8WAh8GBQIxM2RkAg8PZBYCZg8PFgIfBgUCMTRkZAIQD2QWAmYPDxYCH
wYFAjE1ZGQCEQ9kFgJmDw8WAh8GBQIxNmRkAhIPZBYCZg8PFgIfBgUCMTdkZAITD2QWAmYP
DxYCHwYFAjE4ZGQCFA9kFgJmDw8WAh8GBQIxOWRkAhUPDxYCHgdWaXNpYmxlaGRkGAEFCUd
yaWRWaWV3MQ9nZMhHZ3iQZp62S8IR8fTJ5ZL42ira" />
</div>
...

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

    protected override PageStatePersister PageStatePersister
    {
        get
        {
            return new SessionPageStatePersister(this);
        }
    }

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

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE"
value="/wEPaA8FDzhjNzkyNTMzNjE1YWEyNxgBBQlHcmlkVmlldzEPZ2QZw
44JLJFcglwRl9TiNliE82yAuQ==" />

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

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public class PagePersisterBasePage : Page
{
    public PagePersisterBasePage()   {
    }
    protected override PageStatePersister PageStatePersister {
        get {
            return new SessionPageStatePersister(this);
        }
    }
}

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

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

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

<?xml version="1.0"?>
<configuration>
   <system.web>
    <pages pageBaseType="PagePersisterBasePage" />
   </system.web>
</configuration>

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

 

时间: 2024-09-11 04:43:47

ASP.NET 2.0 页面状态持续程序的相关文章

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

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

ASP.NET 2.0中保证应用程序的安全

asp.net|安全|程序 成员和角色管理器提供程序--现在ASP.NET 2.0包含了内建的成员和角色管理服务.由于这些服务都是提供程序驱动的(provider-driven),你可以轻易地变更它,或者用自定义实现来代替它. 登录控件--新的登录控件为站点的基于认证和授权的UI(例如登录窗体.创建用户窗体.密码取回.已登录用户或角色的定制UI)提供了基本模块.这些控件利用ASP.NET 2.0中的内建的成员和角色服务与站点所定义的用户和角色信息交互操作. 大多数Web应用程序的一个重要的部分是

ASP.NET 2.0页面框架的几处变化

asp.net|页面 新增的页面事件:在ASP.NET 2.0中,一个ASP.NET页面的生命周期主要为(红色字体表示ASP.NET 2.0新增加的阶段页面事件):客户端请求页面->预初始化(OnPreInit)->初始化(OnInit)->完成初始化(OnInitComplete)->载入ViewState(LoadViewState)->处理回送数据(IPostBackDataHandler)->Page_OnPreLoad->Page_OnLoad->

ASP.NET 2.0中WEB应用程序的部署

在我们建立完一个WEB应用程序后,我们就要考虑如何进行部署和发布.一般 情况下,尽可能将安装简单化,以使用户有非常好的用户体验.但有的情况下, 可能对安装程序的要求比较高,比如有时要将一些安装配置信息写到注册表中去 .而对于一个WEB应用程序,该如何安装部署呢?这和安装部署一个普通的 WINFORM下的应用程序有些不同.以往,对于WEB应用程序的安装部署总是十分困 难的,但自从ASP.NET 1.1起,直到现在出现的ASP.NET 2.0,安装部署WEB应用程 序将变得十分简单方便.本文将着重介

ASP.NET 2.0页面框架的几处变化_XML/RSS

新增的页面事件: 在ASP.NET 2.0中,一个ASP.NET页面的生命周期主要为(红色字体表示ASP.NET 2.0新增加的阶段页面事件):客户端请求页面->预初始化(OnPreInit)->初始化(OnInit)->完成初始化(OnInitComplete)->载入ViewState(LoadViewState)->处理回送数据(IPostBackDataHandler)->Page_OnPreLoad->Page_OnLoad->回发更改通知(Rai

ASP.NET 2.0页面性能的考虑

asp.net|性能|页面 一般情况下我们通常在一个页面中,结合页面事件处理模型,按顺序一步一步的声明各个处理过程.这就是所说的同步处理(Synchronous),我们可以很方便的定义页面处理的顺序.同步处理虽然很方便,但在耗时高请求处理的时候就会暴露严重的问题,在一个高并发的网站生产服务器上,由于.net处理是基于所谓的ThreadPool的,而Threadpool中的处理线程又是有限的,如果当前ThreadPool中的线程已经全部用尽,而后继又有不断的大规模请求的话,服务器的性能就会严重的下

DB2 9和ASP.NET 2.0构建下一代应用程序

简介 本教程描述了使用具有ASP.NET 2.0主从复合关系增强的DB2的益处.过去,通过连接两个数据网格来支持主从复合关系通常很困难,但是现在,借助Visual Studio 2005和ASP.NET 2.0,只需使用合适的控件就能构建主从复合关系应用程序. 本教程演示如何在不编写代码的情况下构建主从复合应用程序.不必编写代码,我们使用ASP.NET 2.0中的Grid View和Details View控件构建一个示例应用程序,其功能是显示一个公司特定部门的职员. 为何使用支持ASP.NET

ASP.NET 2.0页面框架简要慨述

ASP.NET Web窗体页面框架组件是一个可缩放的通用语言运行时编程模型,它可以用于动态地生成Web页面.ASP.NET页面框架组件是ASP的合理进化(ASP.NET提供的语法与已有的页面是兼容的),它被特意地设计用于解决早期模型中的大量的关键的缺陷.特别是,它提供了建立和使用可供重复使用的(reusable)UI控件的能力,这些控件可以封装公用的功能,从而减少了页面开发者需要编写的代码数量:它使开发者能够清晰有序地构造页面逻辑(并非"缠绕在一起的代码"):它使用的开发工具提供了强大

求让ASP.NET 2.0 页面自动定时重新加载的办法!

问题描述 ASP.NET2.0页面,要求能按页面上用户在下拉框内选择的时间间隔,定时页面重新加载. 解决方案 解决方案二:<script>window.setTimeout("window.location.href='xxx.aspx'",1000)</script>解决方案三:会用到Session+Thread没做过,仅供参解决方案四:1楼的方法是客户端.要在服务器端可以用Timer解决方案五:3楼能给个例子吗?解决方案六:setTimeout("