PageStatePersister 类

定义

为 ASP.NET 视图状态持久性机制提供基本功能。

public ref class PageStatePersister abstract
public abstract class PageStatePersister
type PageStatePersister = class
Public MustInherit Class PageStatePersister
继承
PageStatePersister
派生

示例

下面的代码示例演示如何创建在 PageStatePersister Web 服务器上保存视图和控制状态的对象。 演示 StreamPageStatePersister 了如何重写 LoadSave 方法来提取和保存视图状态信息。 由于状态持久性机制与自适应呈现和客户端功能相关, 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 实例来序列化和反序列化对象状态信息。 或者,可以使用 带宽和资源有限的移动客户端的 类将页面的视图状态存储在服务器上的 SessionPageStatePersister 对象中Session。 在某些情况下,可能会完全禁用视图状态持久性。 如果执行此操作,则结果是有时依赖于状态持久性的页面和控件的行为不正确。 有关页面状态管理和查看状态的详细信息,请参阅 ASP.NET 状态管理概述

如果要编写控件,则可以在字典(对象StateBag)中ViewState存储控件的状态信息。 开发人员将通过 属性检索控件状态 ControlState 。 将键和值分配给 ViewState 属性,对象在 Page 请求之间序列化状态信息。 若要在控件中执行自定义状态处理,请重写 LoadViewStateSaveViewState 方法。 当页面开发人员禁用视图状态时,此字典中存储的任何状态信息都将丢失。 为了缓解此问题,在 ASP.NET 版本 2.0 中,可以将关键状态信息存储在称为控制状态的单独对象中。 当页面开发人员禁用视图状态时,控件状态对象不受影响。 在控件状态对象中存储状态信息要求控件重写 LoadControlStateSaveControlState 方法,并且每次初始化控件时,控件都必须注册以将状态信息存储在控件状态中。 可以通过重写 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 对象,该对象在对 ViewStateControlState 方法的调用期间用于对包含在 Save()Load() 属性中的状态信息进行序列化和反序列化。

ViewState

获取或设置一个对象,该对象表示当前 Page 对象包含的控件用于跨 Web 服务器的 HTTP 请求保留的数据。

方法

Equals(Object)

确定指定对象是否等于当前对象。

(继承自 Object)
GetHashCode()

作为默认哈希函数。

(继承自 Object)
GetType()

获取当前实例的 Type

(继承自 Object)
Load()

Page 对象初始化其控件层次结构时,由派生类重写以反序列化并加载保留的状态信息。

MemberwiseClone()

创建当前 Object 的浅表副本。

(继承自 Object)
Save()

在从内存中卸载 Page 对象时,由派生类重写以对所保留的状态信息进行序列化。

ToString()

返回表示当前对象的字符串。

(继承自 Object)

适用于

另请参阅