Asp.net服務(wù)器控件編程(6) ViewState(二)——ViewState用法和IStateManager
本系列的第三章我們了解了ViewState的基礎(chǔ)知識,也大概的了解了Aspx頁面的生命周期,今天繼續(xù)講解ViewState的Asp.net服務(wù)器控件中的使用和復(fù)雜的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頁面在提交和返回的過程會執(zhí)行LoadViewState和SaveViewState兩方法,這就是控件的狀態(tài)并行化和串行化的過程,而這個過程是通過LosFormatter對象來完成的。Los 格式化程序用于高度壓縮 ASCII 格式的序列化,它實現(xiàn)了整數(shù)、bool、字符串的串行,同時Array、ArrayList和HashTable的對象圖進行了優(yōu)化,控件保存在ViewState中的任何對象都必須由LosFormatter來串行化。
ViewState屬性的類型是StateBag類,改類是個字典,它通過實現(xiàn)ISateManager接口參與狀態(tài)管理。StateBag保存鍵/值對,其中鍵是字符串而值是對象,當(dāng)某個對象添加到StateBag實例中時,StateBag自動為改對象添加一個附加位,它來存儲對象是否被更改過。Control的狀態(tài)管理默認(rèn)都是由ViewState來完成,但是,當(dāng)控件定義了復(fù)雜屬性時,想用ViewState來自動管理這些屬性就不可能了,所以我們復(fù)雜屬性的自定義類型可以通過IStateManager接口來參與狀態(tài)管理。IStateManager的原形如下:
bool IsTrackingViewState { get; }
void LoadViewState(object state);
object SaveViewState();
void TrackViewState();
在.net中Control類沒有從IStateManager繼承下來,但是Control卻實現(xiàn)IStateManager的原形,這里的實現(xiàn)就不在舉例來說明,如果需要的話,可以參考《ASP.NET服務(wù)器控件與組件開發(fā)》的183頁。


浙公網(wǎng)安備 33010602011771號