\n
ASP.NET 2.0 添加了对于改变页面的 ViewState 数据存储位置的支持。本文介绍如何创建一个新类并使用该类在 Session(而不是默认的隐藏字段)中存储 ViewState 信息。
\n
ASP.NET 控件的开发人员利用 ViewState 和控件状态来保持浏览器发出的各请求之间的状态信息。通常,该信息作为由页面呈现的 HTML 标记中的隐藏字段传送给客户端。然后,该页面状态作为下一个窗体提交的一部分传回服务器并还原给控件或页面。即使浏览器使用 HTTP 协议(该协议定义为无状态),但利用临时存储状态信息的功能,控件的开发人员能够轻松地提供更丰富的应用程序体验。
\n
ASP.NET 2.0 允许您修改临时保持页面状态的位置和方式。在某些情况下,避免在客户端与服务器之间往返传送数据可能更为可取。ASP.NET 2.0 提供的两个页面状态持续程序分别是 HiddenFieldPageState 持续程序(我们已提到过)和 SessionPageStatePersister。SessionPageStatePersister 利用与浏览器会话相关的服务器会话存储数据。使用 SessionPageStatePersister 有正反两个方面。对于发送到(自)浏览器的页面而言,使用会话(而非隐藏字段)可以避免其大小的增加。在许多情况中,页面状态是全部标记的一个重要部分。然而,在会话中存储数据将占用宝贵的服务器资源。此外,隐藏字段不像会话那样具有相关的超时。您可以配置一个应用程序,以便将会话保持到后端数据库,并避免将负载直接加到 Web 服务器。这也将扩展至 Web 场方案。
\n
要使用除默认持续程序之外的持续程序,需要重写该页的 PageStatePersister 属性,并返回另一个持续程序的一个实例。首先,下面的一个简单页面只使用大量数字填充一个 ArrayList,然后将它绑定到一个 GridView 控件。
\n
\n
\n
\n以下是引用片段:
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” \n“http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”> \n<script runat=”server”> \n protected override PageStatePersister PageStatePersister { \n get { \n return new SessionPageStatePersister(this); \n } \n } \n protected override void OnLoad(EventArgs e) { \n base.OnLoad(e); \n if (!IsPostBack) { \n ArrayList list = new ArrayList(); \n for (int i = 0; i < 1000; i++) \n { \n list.Add(Convert.ToString(i)); \n } \n GridView1.DataSource = list; \n GridView1.DataBind(); \n } \n } \n</script> \n<html xmlns=”http://www.w3.org/1999/xhtml” > \n<head id=”Head1″ runat=”server”> \n <title>Untitled Page</title> \n</head> \n<body> \n <form id=”form1″ runat=”server”> \n <div> \n <asp:GridView ID=”GridView1″ runat=”server” /> \n <asp:Button ID=”Button1″ runat=”server” Text=”Submit” /></div> \n </form> \n</body> \n</html> \n |
\n
当查看该页面所呈现的 HTML 时,您会看到一个用于传送 ViewState 的较大隐藏字段。
\n
\n
\n
\n以下是引用片段: <!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” \n“http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”> \n<html xmlns=”http://www.w3.org/1999/xhtml” > \n<head><title> \n Untitled Page \n</title></head> \n<body> \n <form name=”form1″ method=”post” action=”default2.aspx” id=”form1″> \n<div> \n<input type=”hidden” name=”__VIEWSTATE” id=”__VIEWSTATE” \nvalue=”/wEPDwUKMTQ0MDQzNjk2Ng9kFgICBA9kFgICAQ88KwANAgAPFgYeC18hRGF0YUJv \ndW5kZx4JUGFnZUNvdW50AgEeC18hSXRlbUNvdW50AhRkDBQrAAEWBh4EVHlwZRkrAh4ETmF \ntZQUESXRlbR4JRGF0YUZpZWxkBQEhFgJmD2QWKgIBD2QWAmYPDxYCHgRUZXh0BQEwZGQCAg \n9kFgJmDw8WAh8GBQExZGQCAw9kFgJmDw8WAh8GBQEyZGQCBA9kFgJmDw8WAh8GBQEzZGQCB \nQ9kFgJmDw8WAh8GBQE0ZGQCBg9kFgJmDw8WAh8GBQE1ZGQCBw9kFgJmDw8WAh8GBQE2ZGQC \nCA9kFgJmDw8WAh8GBQE3ZGQCCQ9kFgJmDw8WAh8GBQE4ZGQCCg9kFgJmDw8WAh8GBQE5ZGQ \nCCw9kFgJmDw8WAh8GBQIxMGRkAgwPZBYCZg8PFgIfBgUCMTFkZAIND2QWAmYPDxYCHwYFAj \nEyZGQCDg9kFgJmDw8WAh8GBQIxM2RkAg8PZBYCZg8PFgIfBgUCMTRkZAIQD2QWAmYPDxYCH \nwYFAjE1ZGQCEQ9kFgJmDw8WAh8GBQIxNmRkAhIPZBYCZg8PFgIfBgUCMTdkZAITD2QWAmYP \nDxYCHwYFAjE4ZGQCFA9kFgJmDw8WAh8GBQIxOWRkAhUPDxYCHgdWaXNpYmxlaGRkGAEFCUd \nyaWRWaWV3MQ9nZMhHZ3iQZp62S8IR8fTJ5ZL42ira” /> \n</div> \n… |
\n
当我们向 PageStatePersister 属性添加重写并使用内置 SessionPageStatePersister 时,该页面的行为保持不变,但是用于大量状态数据的存储将从隐藏字段转换为会话状态。
\n
\n