Поделиться через


PageStatePersister Класс

Определение

Предоставляет базовую функциональность для механизмов сохранения состояния представления ASP.NET.

public ref class PageStatePersister abstract
public abstract class PageStatePersister
type PageStatePersister = class
Public MustInherit Class PageStatePersister
Наследование
PageStatePersister
Производный

Примеры

В следующем примере кода показано, как создать PageStatePersister объект , сохраняющий состояние представления и управления на веб-сервере. Демонстрирует StreamPageStatePersister , как переопределить Load методы и для Save извлечения и сохранения сведений о состоянии представления. Поскольку механизмы сохраняемости состояния связаны с адаптивной отрисовкой и возможностями клиента, MyPageAdapter класс предоставляется для активации StreamPageStatePersister для ASP.NET приложения. Наконец, предоставляется файл возможностей браузера (.browser) для включения адаптера MyPageAdapter для определенного класса клиентов (в данном случае это веб-браузер по умолчанию).

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

Скомпилируйте эти два класса в сборку, которую можно использовать для запуска примера с помощью следующей командной строки компилятора. Убедитесь, что скомпилированная сборка находится в каталоге \Bin под корнем приложения ASP.NET.

// 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 адаптер, необходимо создать каталог с именем Browsers под корнем приложения ASP.NET и включить в него файл .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 заключается в сохранении сведений о состоянии в виде строки в кодировке Base64 в скрытом ЭЛЕМЕНТе HTML (элементе с type атрибутом , для параметра задано значение "hidden") на странице. Страница 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, используют для сохранения в HTTP-запросах к веб-серверу.

Page

Возвращает или задает объект Page, для которого создается механизм сохранения состояния представления.

StateFormatter

Возвращает объект IStateFormatter, используемый для сериализации и десериализации данных о состоянии, содержащихся в свойствах ViewState и ControlState во время вызова методов Save() и Load().

ViewState

Возвращает или задает объект, представляющий данные, которые элементы управления, содержащиеся в текущем объекте Page, используют для сохранения в HTTP-запросах к веб-серверу.

Методы

Equals(Object)

Определяет, равен ли указанный объект текущему объекту.

(Унаследовано от Object)
GetHashCode()

Служит хэш-функцией по умолчанию.

(Унаследовано от Object)
GetType()

Возвращает объект Type для текущего экземпляра.

(Унаследовано от Object)
Load()

Переопределение производными классами для десериализации и загрузки сохраненной информации о состоянии при инициализации объектом Page собственной иерархии элементов управления.

MemberwiseClone()

Создает неполную копию текущего объекта Object.

(Унаследовано от Object)
Save()

Переопределение производными классами для сериализации сохраненных данных о состоянии при выгрузке из памяти объекта Page.

ToString()

Возвращает строку, представляющую текущий объект.

(Унаследовано от Object)

Применяется к

См. также раздел