PageStatePersister 类
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
为 ASP.NET 视图状态持久性机制提供基本功能。
public ref class PageStatePersister abstract
public abstract class PageStatePersister
type PageStatePersister = class
Public MustInherit Class PageStatePersister
- 继承
-
PageStatePersister
- 派生
示例
下面的代码示例演示如何创建在 PageStatePersister Web 服务器上保存视图和控制状态的对象。 演示 StreamPageStatePersister
了如何重写 Load 提取和保存视图状态信息的方法 Save 。 由于状态持久性机制与自适应呈现和客户端功能相关,因此提供MyPageAdapter
类以激活 StreamPageStatePersister
ASP.NET 应用程序。 最后,提供了浏览器功能 (.browser) 文件,以便在此例中为特定类客户端启用 MyPageAdapter
适配器, (默认 Web 浏览器) 。
namespace Samples.AspNet.CS
{
using System;
using System.IO;
using System.Security.Permissions;
using System.Web;
using System.Web.UI;
//
// The StreamPageStatePersister is an example view state
// persistence mechanism that persists view and control
// state on the Web server.
//
[AspNetHostingPermission(SecurityAction.Demand, Level = AspNetHostingPermissionLevel.Minimal)]
public class StreamPageStatePersister : PageStatePersister
{
public StreamPageStatePersister(Page page)
: base(page)
{
}
//
// Load ViewState and ControlState.
//
public override void Load()
{
Stream stateStream = GetSecureStream();
// Read the state string, using the StateFormatter.
StreamReader reader = new StreamReader(stateStream);
IStateFormatter formatter = this.StateFormatter;
string fileContents = reader.ReadToEnd();
// Deserilize returns the Pair object that is serialized in
// the Save method.
Pair statePair = (Pair)formatter.Deserialize(fileContents);
ViewState = statePair.First;
ControlState = statePair.Second;
reader.Close();
stateStream.Close();
}
//
// Persist any ViewState and ControlState.
//
public override void Save()
{
if (ViewState != null || ControlState != null)
{
if (Page.Session != null)
{
Stream stateStream = GetSecureStream();
StreamWriter writer = new StreamWriter(stateStream);
IStateFormatter formatter = this.StateFormatter;
Pair statePair = new Pair(ViewState, ControlState);
// Serialize the statePair object to a string.
string serializedState = formatter.Serialize(statePair);
writer.Write(serializedState);
writer.Close();
stateStream.Close();
}
else
{
throw new InvalidOperationException("Session needed for StreamPageStatePersister.");
}
}
}
// Return a secure Stream for your environment.
private Stream GetSecureStream()
{
// You must provide the implementation to build
// a secure Stream for your environment.
return null;
}
}
}
Imports System.IO
Imports System.Security.Permissions
Imports System.Web
Imports System.Web.UI
Namespace Samples.AspNet.VB
' The StreamPageStatePersister is an example view state
' persistence mechanism that persists view and control
' state on the Web server.
'
<AspNetHostingPermission(SecurityAction.Demand, Level:=AspNetHostingPermissionLevel.Minimal)> _
Public Class StreamPageStatePersister
Inherits PageStatePersister
Public Sub New(ByVal page As Page)
MyBase.New(page)
End Sub
'
' Load ViewState and ControlState.
'
Public Overrides Sub Load()
Dim stateStream As Stream
stateStream = GetSecureStream()
' Read the state string, using the StateFormatter.
Dim reader As New StreamReader(stateStream)
Dim serializedStatePair As String
serializedStatePair = reader.ReadToEnd
Dim statePair As Pair
Dim formatter As IStateFormatter
formatter = Me.StateFormatter
' Deserilize returns the Pair object that is serialized in
' the Save method.
statePair = CType(formatter.Deserialize(serializedStatePair), Pair)
ViewState = statePair.First
ControlState = statePair.Second
reader.Close()
stateStream.Close()
End Sub
'
' Persist any ViewState and ControlState.
'
Public Overrides Sub Save()
If Not (ViewState Is Nothing) OrElse Not (ControlState Is Nothing) Then
If Not (Page.Session Is Nothing) Then
Dim stateStream As Stream
stateStream = GetSecureStream()
' Write a state string, using the StateFormatter.
Dim writer As New StreamWriter(stateStream)
Dim formatter As IStateFormatter
formatter = Me.StateFormatter
Dim statePair As New Pair(ViewState, ControlState)
Dim serializedState As String
serializedState = formatter.Serialize(statePair)
writer.Write(serializedState)
writer.Close()
stateStream.Close()
Else
Throw New InvalidOperationException("Session needed for StreamPageStatePersister.")
End If
End If
End Sub
' Return a secure Stream for your environment.
Private Function GetSecureStream() As Stream
' You must provide the implementation to build
' a secure Stream for your environment.
Return Nothing
End Function
End Class
End Namespace
下面的代码示例演示如何创建返回PageAdapter实例的StreamPageStatePersister
类,该实例用于保存 ASP.NET 网页的视图和控制状态。
namespace Samples.AspNet.CS {
using System.Security.Permissions;
using System.Web;
using System.Web.UI;
[AspNetHostingPermission(SecurityAction.Demand, Level=AspNetHostingPermissionLevel.Minimal)]
public class MyPageAdapter : System.Web.UI.Adapters.PageAdapter {
public override PageStatePersister GetStatePersister() {
return new Samples.AspNet.CS.StreamPageStatePersister(Page);
}
}
}
Imports System.Security.Permissions
Imports System.Web
Imports System.Web.UI
Namespace Samples.AspNet.VB
<AspNetHostingPermission(SecurityAction.Demand, Level:=AspNetHostingPermissionLevel.Minimal)> _
Public Class MyPageAdapter
Inherits System.Web.UI.Adapters.PageAdapter
Public Overrides Function GetStatePersister() As PageStatePersister
Return New Samples.AspNet.VB.StreamPageStatePersister(Page)
End Function 'GetStatePersister
End Class
End Namespace
使用以下编译器命令行将这两个类编译为可用于运行示例的程序集。 确保编译的程序集位于 ASP.NET 应用程序根目录下的 \Bin 目录中。
// C:\>csc /t:library /out:C:\inetpub\wwwroot\bin\Samples.AspNet.CS.dll MyPageAdapter.cs TextFilePageStatePersister.cs
//
// C:\>
' C:\>vbc /t:library /out:C:\inetpub\wwwroot\bin\Samples.AspNet.VB.dll MyPageAdapter.vb TextFilePageStatePersister.vb
'
最后,若要启用MyPageAdapter
适配器,必须在 ASP.NET 应用程序根目录下创建名为 Browser 的目录,并包含配置信息的 .browser 文件。 <refid>
配置文件中的元素指示配置将替代 Default.browser 配置文件中为默认浏览器指定的值。 在此示例中,MyPageAdapter
用于 ASP.NET 网页 (,其中通常不使用适配器) 。
<browsers>
<browser refid="Default" >
<controlAdapters>
<adapter
controlType="System.Web.UI.Page"
adapterType="Samples.AspNet.CS.MyPageAdapter" />
</controlAdapters>
</browser>
</browsers>
注解
HTTP 请求和响应本质上是无状态的。 若要在 HTTP 请求之间维护状态信息,ASP.NET 服务器页可以存储Page状态。 此状态称为视图状态,由页面和控件设置和数据组成,使页面和控件显示为用户最后一次往返服务器时看到的控件和与之交互的相同。 存在多个机制,用于存储对同一页的连续请求之间的视图状态。 抽象 PageStatePersister 类表示这些状态信息存储机制的基类。
ASP.NET 中的默认视图状态持久性机制是在隐藏的 HTML 元素中将状态信息保留为 Base64 编码的字符串, (属性设置为"hidden"
页面上) 的元素type
。 ASP.NET 页使用对象HiddenFieldPageStatePersister来执行这项工作,使用IStateFormatter实例序列化和反序列化对象状态信息。 或者,可以使用具有有限带宽和资源的移动客户端类将页面 Session 的视图状态存储在服务器上的 SessionPageStatePersister 对象中。 在某些情况下,可能会完全禁用视图状态持久性。 如果执行此操作,结果是有时依赖于状态持久性的页面和控件的行为不正确。 有关页面状态管理和视图状态的详细信息,请参阅 ASP.NET 状态管理概述。
如果要编写控件,则可以在字典中 ViewState 存储控件的状态信息,该字典是一个 StateBag 对象。 开发人员将通过属性检索控件状态 ControlState 。 为属性分配键和值 ViewState ,对象 Page 在请求之间序列化状态信息。 若要在控件中执行自定义状态处理,请重写 LoadViewState 和 SaveViewState 方法。 当页面开发人员禁用视图状态时,此字典中存储的任何状态信息都将丢失。 若要缓解此问题,ASP.NET 版本 2.0 中,可以将关键状态信息存储在名为控制状态的单独对象中。 当页面开发人员禁用视图状态时,控件状态对象不会受到影响。 在控件状态对象中存储状态信息需要控件重写 LoadControlState 和 SaveControlState 方法,并且控件在每次初始化控件时都会注册该控件以在控件状态中存储状态信息。 可以通过重写 OnInit 方法和调用 RegisterRequiresControlState 方法来注册控件以使用控件状态。 有关在开发控件时使用ViewState属性和控件状态的详细信息,请参阅开发自定义 ASP.NET 服务器控件。
若要维护不能支持现有视图状态持久性机制的客户端的视图状态,可以扩展PageStatePersister类来引入自己的视图状态持久性方法,并且可以使用页面适配器来配置 ASP.NET 应用程序,以根据提供页面的客户端类型使用不同的视图状态持久性机制。 派生自类的 PageStatePersister 类必须重写抽象 Save 方法,以在持久性介质中存储视图状态和控制状态,并重写 Load 该方法以提取它。 如果需要将视图状态和控制状态序列化为字符串,可以使用 IStateFormatter 使用 StateFormatter 属性访问的对象。 它将对象状态信息有效地序列化和反序列化为 Base64 编码的字符串。 还可以重写属性 StateFormatter 以提供自己的对象状态序列化机制。
构造函数
PageStatePersister(Page) |
初始化 PageStatePersister 类的新实例。 |
属性
ControlState |
获取或设置一个对象,该对象表示当前 Page 对象包含的控件用于跨 Web 服务器的 HTTP 请求保留的数据。 |
Page |
获取或设置为其创建视图状态持久性机制的 Page 对象。 |
StateFormatter |
获取一个 IStateFormatter 对象,该对象在对 ViewState 和 ControlState 方法的调用期间用于对包含在 Save() 和 Load() 属性中的状态信息进行序列化和反序列化。 |
ViewState |
获取或设置一个对象,该对象表示当前 Page 对象包含的控件用于跨 Web 服务器的 HTTP 请求保留的数据。 |
方法
Equals(Object) |
确定指定对象是否等于当前对象。 (继承自 Object) |
GetHashCode() |
作为默认哈希函数。 (继承自 Object) |
GetType() |
获取当前实例的 Type。 (继承自 Object) |
Load() |
在 Page 对象初始化其控件层次结构时,由派生类重写以反序列化并加载保留的状态信息。 |
MemberwiseClone() |
创建当前 Object 的浅表副本。 (继承自 Object) |
Save() |
在从内存中卸载 Page 对象时,由派生类重写以对所保留的状态信息进行序列化。 |
ToString() |
返回表示当前对象的字符串。 (继承自 Object) |