StateItem 類別
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
表示當檢視狀態資訊保存於 Web 要求之間時,儲存在 StateBag 類別中的項目。 此類別無法獲得繼承。
public ref class StateItem sealed
public sealed class StateItem
type StateItem = class
Public NotInheritable Class StateItem
- 繼承
-
StateItem
範例
下列程式代碼範例會使用 Value 類別的 StateItem 和 IsDirty 屬性來儲存簡單自訂 ASP.NET 伺服器控制項類別的狀態。 StateBagSample
當頁面張貼到伺服器時,屬性會 IsDirty 檢查專案是否已修改。 狀態值是藉由存取 Value 屬性來顯示。
// Create a namespace that contains a class, MyItem,
// that implements the IStateManager interface and
// another, MyControl, that overrides its own view-state
// management methods to use those of MyItem.
using System;
using System.Web;
using System.Web.UI;
using System.Collections;
using System.Security.Permissions;
namespace StateBagSample
{
// Create a class that implements IStateManager so that
// it can manage its own view state.
[AspNetHostingPermission(SecurityAction.Demand,
Level = AspNetHostingPermissionLevel.Minimal)]
public sealed class MyItem : IStateManager
{
private string _message;
// The StateBag object that allows you to save
// and restore view-state information.
private StateBag _viewstate;
// The constructor for the MyItem class.
public MyItem(string mesg)
{
_message = mesg;
_viewstate = new StateBag();
_viewstate.Add("message", _message);
}
// Create a Message property that reads from and writes
// to view state. If the set accessor writes the message
// value to view state, the StateBag.SetItemDirty method
// is called, telling view state that the item has changed.
public string Message
{
get
{
return (string)_viewstate["message"];
}
set
{
_message = value;
_viewstate.SetItemDirty("message", true);
}
}
// Implement the LoadViewState method. If the saved view state
// exists, the view-state value is loaded to the MyItem control.
void IStateManager.LoadViewState(object savedState)
{
_message = (string)_viewstate["message"];
if (savedState != null)
((IStateManager)_viewstate).LoadViewState(savedState);
}
// Implement the SaveViewState method. If the StateBag
// that stores the MyItem class's view state contains
// a value for the message property and if the value
// has changed since the TrackViewState method was last
// called, all view state for this class is deleted,
// using the StateBag.Clear method,and the new value is added.
object IStateManager.SaveViewState()
{
// Check whether the message property exists in
// the ViewState property, and if it does, check
// whether it has changed since the most recent
// TrackViewState method call.
if (!((IDictionary)_viewstate).Contains("message") || _viewstate.IsItemDirty("message"))
{
_viewstate.Clear();
// Add the _message property to the StateBag.
_viewstate.Add("message", _message);
}
return ((IStateManager)_viewstate).SaveViewState();
}
// Implement the TrackViewState method for this class by
// calling the TrackViewState method of the class's private
// _viewstate property.
void IStateManager.TrackViewState()
{
((IStateManager)_viewstate).TrackViewState();
}
// Implement the IsTrackingViewState method for this class
// by calling the IsTrackingViewState method of the class's
// private _viewstate property.
bool IStateManager.IsTrackingViewState
{
get
{
return ((IStateManager)_viewstate).IsTrackingViewState;
}
}
// Create a function that iterates through the view-state
// values stored for this class and returns the
// results as a string.
public string EnumerateViewState()
{
string keyName, keyValue;
string result = String.Empty;
StateItem myStateItem;
IDictionaryEnumerator myDictionaryEnumerator = _viewstate.GetEnumerator();
while (myDictionaryEnumerator.MoveNext())
{
keyName = (string)myDictionaryEnumerator.Key;
myStateItem = (StateItem)myDictionaryEnumerator.Value;
keyValue = (string)myStateItem.Value;
result = result + "<br>ViewState[" + keyName + "] = " + keyValue;
}
return result;
}
}
// This class contains an instance of the MyItem class as
// private member. It overrides the state management methods
// of the Control class, since it has to invoke state
// management methods of MyItem whenever its own
// view state is being saved, loaded, or tracked.
[AspNetHostingPermission(SecurityAction.Demand,
Level = AspNetHostingPermissionLevel.Minimal)]
public sealed class MyControl : Control
{
private MyItem myItem;
public MyControl()
: base()
{
myItem = new MyItem("Hello World!");
}
// Override the LoadViewState method of the Control class.
protected override void LoadViewState(object savedState)
{
if (savedState != null)
{
object[] myState = (object[])savedState;
if (myState[0] != null)
base.LoadViewState(myState[0]);
if (myState[1] != null)
((IStateManager)myItem).LoadViewState(myState[1]);
}
}
// Override the TrackViewState method of the Control class
// to call the version of this method that was
// implemented in the MyItem class.
protected override void TrackViewState()
{
base.TrackViewState();
if (myItem != null)
((IStateManager)myItem).TrackViewState();
}
// Override the SaveViewState method of the Control class to
// call the version of this method that was implemented by
// the MyItem class.
protected override object SaveViewState()
{
object baseState = base.SaveViewState();
object itemState = (myItem != null) ? ((IStateManager)myItem).SaveViewState() : null;
object[] myState = new object[2];
myState[0] = baseState;
myState[1] = itemState;
return myState;
}
public void SetMessage(string mesg)
{
myItem.Message = mesg;
}
public string GetMessage()
{
return myItem.Message;
}
// Display the contents of Message and ViewState properties.
protected override void Render(HtmlTextWriter output)
{
// Track changes to view state before rendering.
TrackViewState();
output.Write("Message: " + myItem.Message);
output.Write("<br>");
output.Write("<br>Enumerating the view state of the custom control<br>");
output.Write(myItem.EnumerateViewState());
}
}
}
' Create a namespace that contains a class, MyItem,
' that implements the IStateManager interface and
' another, MyControl, that overrides its own view-state
' management methods to use those of MyItem.
Imports System.Web
Imports System.Web.UI
Imports System.Collections
Imports System.Security.Permissions
Namespace StateBagSampleVB
' Create a class that implements IStateManager so that
' it can manage its own view state.
<AspNetHostingPermission(SecurityAction.Demand, _
Level:=AspNetHostingPermissionLevel.Minimal)> _
Public NotInheritable Class MyItem
Implements IStateManager
Private _message As String
' The StateBag object that allows you to save
' and restore view-state information.
Private _viewstate As StateBag
' The constructor for the MyItem class.
Public Sub New(ByVal mesg As String)
_message = mesg
_viewstate = New StateBag()
_viewstate.Add("message", _message)
End Sub
' Create a Message property that reads from and writes
' to view state. If the set accessor writes the message
' value to view state, the StateBag.SetItemDirty method
' is called, telling view state that the item has changed.
Public Property Message() As String
Get
Return CStr(_viewstate("message"))
End Get
Set(ByVal value As String)
_message = value
_viewstate.SetItemDirty("message", True)
End Set
End Property
' Implement the LoadViewState method. If the saved view state
' exists, the view-state value is loaded to the MyItem
' control.
Sub LoadViewState(ByVal savedState As Object) Implements IStateManager.LoadViewState
_message = CStr(_viewstate("message"))
If Not (savedState Is Nothing) Then
CType(_viewstate, IStateManager).LoadViewState(savedState)
End If
End Sub
' Implement the SaveViewState method. If the StateBag
' that stores the MyItem class's view state contains
' a value for the message property and if the value
' has changed since the TrackViewState method was last
' called, all view state for this class is deleted,
' using the StateBag.Clear method,and the new value is added.
Function SaveViewState() As Object Implements IStateManager.SaveViewState
' Check whether the message property exists in
' the ViewState property, and if it does, check
' whether it has changed since the most recent
' TrackViewState method call.
If Not CType(_viewstate, IDictionary).Contains("message") OrElse _viewstate.IsItemDirty("message") Then
_viewstate.Clear()
' Add the _message property to the StateBag.
_viewstate.Add("message", _message)
End If
Return CType(_viewstate, IStateManager).SaveViewState()
End Function 'IStateManager.SaveViewState
' Implement the TrackViewState method for this class by
' calling the TrackViewState method of the class's private
' _viewstate property.
Sub TrackViewState() Implements IStateManager.TrackViewState
CType(_viewstate, IStateManager).TrackViewState()
End Sub
' Implement the IsTrackingViewState method for this class
' by calling the IsTrackingViewState method of the class's
' private _viewstate property.
ReadOnly Property IsTrackingViewState() As Boolean Implements IStateManager.IsTrackingViewState
Get
Return CType(_viewstate, IStateManager).IsTrackingViewState
End Get
End Property
' Create a function that iterates through the view-state
' values stored for this class and returns the
' results as a string.
Public Function EnumerateViewState() As String
Dim keyName, keyValue As String
Dim result As String = [String].Empty
Dim myStateItem As StateItem
Dim myDictionaryEnumerator As IDictionaryEnumerator = _viewstate.GetEnumerator()
While myDictionaryEnumerator.MoveNext()
keyName = CStr(myDictionaryEnumerator.Key)
myStateItem = CType(myDictionaryEnumerator.Value, StateItem)
keyValue = CStr(myStateItem.Value)
result = result + "<br>ViewState[" + keyName + "] = " + keyValue
End While
Return result
End Function 'EnumerateViewState
End Class
' This class contains an instance of the MyItem class as
' private member. It overrides the state management methods
' of the Control class, since it has to invoke state
' management methods of MyItem whenever its own
' view state is being saved, loaded, or tracked.
<AspNetHostingPermission(SecurityAction.Demand, _
Level:=AspNetHostingPermissionLevel.Minimal)> _
Public NotInheritable Class MyControl
Inherits Control
Private myItem As MyItem
Public Sub New()
myItem = New MyItem("Hello World!")
End Sub
' Override the LoadViewState method of the Control class.
Protected Overrides Sub LoadViewState(ByVal savedState As Object)
If Not (savedState Is Nothing) Then
Dim myState As Object() = CType(savedState, Object())
If Not (myState(0) Is Nothing) Then
MyBase.LoadViewState(myState(0))
End If
If Not (myState(1) Is Nothing) Then
CType(myItem, IStateManager).LoadViewState(myState(1))
End If
End If
End Sub
' Override the TrackViewState method of the Control class
' to call the version of this method that was
' implemented in the MyItem class.
Protected Overrides Sub TrackViewState()
MyBase.TrackViewState()
If Not (myItem Is Nothing) Then
CType(myItem, IStateManager).TrackViewState()
End If
End Sub
' Override the SaveViewState method of the Control class to
' call the version of this method that was implemented by
' the MyItem class.
Protected Overrides Function SaveViewState() As Object
Dim baseState As Object = MyBase.SaveViewState()
Dim itemState As Object
If Not (myItem Is Nothing) Then
itemState = CType(myItem, IStateManager).SaveViewState()
Else
itemState = Nothing
End If
Dim myState(1) As Object
myState(0) = baseState
myState(1) = itemState
Return myState
End Function 'SaveViewState
Public Sub SetMessage(ByVal mesg As String)
myItem.Message = mesg
End Sub
Public Function GetMessage() As String
Return myItem.Message
End Function 'GetMessage
' Display the contents of Message and ViewState properties.
Protected Overrides Sub Render(ByVal output As HtmlTextWriter)
' Track changes to view state before rendering.
TrackViewState()
output.Write(("Message: " + myItem.Message))
output.Write("<br>")
output.Write("<br>Enumerating the view state of the custom control<br>")
output.Write(myItem.EnumerateViewState())
End Sub
End Class
End Namespace 'StateBagSampleVB
備註
檢視狀態是頁面或 ASP.NET 伺服器控制件屬性值的累積,並且會傳送至隱藏欄位中的要求瀏覽器。
您可以使用 屬性或 方法,明確地將物件新增StateItem至 ASP.NET 伺服器控件的物件StateBagItem[]。Add 接著會 StateBag 追蹤其儲存之所有項目的變更。 物件的任何變更 StateItem 會反映在其 IsDirty 屬性中。 這些變更是透過呼叫 SaveViewState 方法,在伺服器控件處理的儲存檢視狀態階段儲存,就在控件轉譯至頁面之前。 如需詳細資訊,請參閱 ASP.NET Web 伺服器控件。
屬性
IsDirty |
取得或設定數值,表示是否已經修改 StateItem 物件。 |
Value |
方法
Equals(Object) |
判斷指定的物件是否等於目前的物件。 (繼承來源 Object) |
GetHashCode() |
做為預設雜湊函式。 (繼承來源 Object) |
GetType() |
取得目前執行個體的 Type。 (繼承來源 Object) |
MemberwiseClone() |
建立目前 Object 的淺層複製。 (繼承來源 Object) |
ToString() |
傳回代表目前物件的字串。 (繼承來源 Object) |