PageStatePersister 類別

定義

提供 ASP.NET 檢視狀態保存性機制的基本功能。

public ref class PageStatePersister abstract
public abstract class PageStatePersister
type PageStatePersister = class
Public MustInherit Class PageStatePersister
繼承
PageStatePersister
衍生

範例

下列程式碼範例示範如何建立 PageStatePersister 物件,以儲存網頁伺服器上的檢視和控制狀態。 示範 StreamPageStatePersister 如何覆寫 LoadSave 方法來擷取及儲存檢視狀態資訊。 由於狀態持續性機制與調適型轉譯和用戶端功能相關,因此會 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

使用下列編譯器命令列,將這兩個類別編譯成可用來執行範例的元件。 請確定編譯的元件位於 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 編碼字串, (type 屬性設定為 "hidden" 頁面上) 的專案。 ASP.NET 網頁會使用 HiddenFieldPageStatePersister 物件來執行這項工作,並使用 IStateFormatter 實例來序列化和還原序列化物件狀態資訊。 或者,您可以使用具有有限頻寬和資源的行動用戶端類別,將頁面的檢視狀態儲存在 Session 伺服器上的 SessionPageStatePersister 物件中。 在某些情況下,您可以完全停用檢視狀態持續性。 如果您這樣做,結果就是有時候依賴狀態持續性的頁面和控制項不會正確運作。 如需頁面狀態管理和檢視狀態的詳細資訊,請參閱 ASP.NET 狀態管理概觀

如果您要撰寫控制項,您可以將控制項的狀態資訊儲存在字典中 ViewState ,也就是 StateBag 物件。 開發人員會透過 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

取得或設定物件,表示對 Web 伺服器的 HTTP 要求之間,目前 Page 物件所包含的控制項用以保存的資料。

Page

取得或設定 Page 物件,以建立檢視狀態保存性機制。

StateFormatter

取得 IStateFormatter 物件,對 ViewStateControlState 方法呼叫時,這個物件會用來序列化和還原序列化 Save()Load() 屬性中包含的狀態資訊。

ViewState

取得或設定物件,表示對 Web 伺服器的 HTTP 要求之間,目前 Page 物件所包含的控制項用以保存的資料。

方法

Equals(Object)

判斷指定的物件是否等於目前的物件。

(繼承來源 Object)
GetHashCode()

做為預設雜湊函式。

(繼承來源 Object)
GetType()

取得目前執行個體的 Type

(繼承來源 Object)
Load()

Page 物件初始化其控制階層架構時,由衍生類別覆寫,以還原序列化並載入保存的狀態資訊。

MemberwiseClone()

建立目前 Object 的淺層複製。

(繼承來源 Object)
Save()

從記憶體卸載 Page 物件時,由衍生類別覆寫,以序列化保存的狀態資訊。

ToString()

傳回代表目前物件的字串。

(繼承來源 Object)

適用於

另請參閱