ViewState相信大家都會使用,可ViewState到底是什麼,又有多少人知道呢?
StateBag類這個就不用多說啦吧
在Asp.net 2.0 裡,用到StateBag有三處
1 Control._viewState 這個就是大家使用的ViewState
2 WebControl.attrState這個是存放Attribute的
3 Style.statebag是存放樣式的
.......
Page生命週期內SaveAllState時
需要先產生個Piar類,在調用this.SavePageStateToPersistenceMedium(pair1);時,將其序列化
注意:Asp.net2.0隻實現了HiddenFieldPageStatePersister,使用者可以從重寫,或者使用ControlAdapter提供其它形式的進理機制
HiddenFieldPageStatePersister.Save時會過pair1進行序列化
序列化時,.net提供了三種方式
1使用密鑰
2.使用Mac
3不使用
//先序列化
this.Serialize(outputStream, stateGraph);
outputStream.SetLength(outputStream.Position);
byte[] buf = outputStream.GetBuffer();
int length = (int)outputStream.Length;
//判斷當前Page.RequiresViewStateEncryptionInternal屬性傳回值是不是需要加密
//如果未調用Page.RegisterRequiresViewStateEncryption,則預設為false
//如果介面設定了RegisterRequiresViewStateEncryption和EnableViewStateMac,加密優先於Mac
if ((this._page != null) && this._page.RequiresViewStateEncryptionInternal) //加密
{
buf = MachineKeySection.EncryptOrDecryptData(true, buf, this.GetMacKeyModifier(), 0, length);
length = buf.Length;
}
else if (((this._page != null) && this._page.EnableViewStateMac) || (this._macKeyBytes != null))//設定可以使用Mac
{
buf = MachineKeySection.GetEncodedData(buf, this.GetMacKeyModifier(), 0, ref length);
}
text = Convert.ToBase64String(buf, 0, length); // null of either
談到這,很多人要問pair1裡放的是什麼,我畫了一幅圖,詳細說明了一下