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


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 и включить файл браузера с сведениями о конфигурации. Элемент <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)

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

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