本系列的第三章我們瞭解了ViewState的基礎知識,也大概的瞭解了Aspx頁面的生命週期,今天繼續講解ViewState的Asp.net伺服器控制項中的使用和複雜的ViewState管理。
ViewState的簡單使用我們只要舉個簡單的例子即可:
using System;
using System.Collections.Generic;
using System.Text;
using System.Web.UI.WebControls;
namespace ClassLibrary1
{
public class Class1 : WebControl
{
private string _sex;
public string Sex
{
get
{
return _sex;
}
set
{
_sex = value;
}
}
public string Name
{
get
{
if (EnableViewState)
{
object o = ViewState["Name"];
if (o != null)
return (string)o;
else
return string.Empty;
}
else
return string.Empty;
}
set
{
if (EnableViewState)
ViewState["Name"] = value;
}
}
protected override void RenderChildren(System.Web.UI.HtmlTextWriter writer)
{
writer.Write("Name:" + Name + "<br>");
writer.Write("Sex:" + Sex);
}
}
}
效果如下:
一個Aspx頁面在提交和返回的過程會執行LoadViewState和SaveViewState兩方法,這就是控制項的狀態並行化和序列化的過程,而這個過程是通過LosFormatter對象來完成的。Los 格式化程式用於高度壓縮 ASCII 格式的序列化,它實現了整數、bool、字串的串列,同時Array、ArrayList和HashTable的對象圖進行了最佳化,控制項儲存在ViewState中的任何對象都必須由LosFormatter來序列化。
ViewState屬性的類型是StateBag類,改類是個字典,它通過實現ISateManager介面參與狀態管理。StateBag儲存鍵/值對,其中鍵是字串而值是對象,當某個對象添加到StateBag執行個體中時,StateBag自動為改對象添加一個附加位,它來儲存物件是否被更改過。Control的狀態管理預設都是由ViewState來完成,但是,當控制項定義了複雜屬性時,想用ViewState來自動管理這些屬性就不可能了,所以我們複雜屬性的自訂類型可以通過IStateManager介面來參與狀態管理。IStateManager的原形如下:
bool IsTrackingViewState { get; }
void LoadViewState(object state);
object SaveViewState();
void TrackViewState();
在.net中Control類沒有從IStateManager繼承下來,但是Control卻實現IStateManager的原形,這裡的實現就不在舉例來說明,如果需要的話,可以參考《ASP.NET伺服器控制項與組件開發》的183頁。