服务器控件编程中的控件状态保存机制
服务器控件(Server Control)是ASP.NET中的一个亮点。我们知道大部分的服务器控件是依赖视图状态(ViewState)的,这个状态的保存有助于在回发(Postback)过程中保留当前控件的值,并进行还原。
虽然视图状态很有用,但它也会带来一些负面的影响,例如它将使得页面体积变大一些,因为它是用字符串(当然是已经经过编码的字符串)的形式保存在页面的一个隐藏域(Hidden Field)中的。基于性能方面的考虑,很多人都建议在合适的时候禁用视图状态(不管是在应用程序级别、页面级别,还是在控件级别),典型的做法例如下面这样就可以了
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication1._Default" EnableViewState="false" %>
但是,如果视图状态一旦被禁用,那么就自然而然会失去了自动保留状态的特性。这个问题,尤其当我们在开发服务器控件的时候会很严重,一个事实就是:我们无法预知也无法控制使用者是否会在页面级别关闭视图状态。
为此,ASP.NET提供了另外一种机制,我们称为控件状态(Control State)。这使得控件开发者可以自己决定是否保存状态,而不受使用者或者调用方所左右。因为视图状态是无法被禁用的
下面是一个典型的写法
#region 控件状态及其保存
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
Page.RequiresControlState(this);//这句代码很重要,声明我们需要为该控件进行状态保存
}
protected override void LoadControlState(object savedState)//重写该方法进行状态的还原
{
base.LoadControlState(savedState);
object[] status = (object[])savedState;
m_RecordCount =(int) status[0];
m_PageSize = (int)status[1];
m_IndexNum = (int)status[2];
m_pageIndex = (int)status[3];
}
protected override object SaveControlState()//重写该方法进行状态的保存
{
object[] status = new object[] { m_RecordCount, m_PageSize, m_IndexNum,m_pageIndex };//如果有多个属性需要保存,可以通过一个对象数组的方式保存
return status;
}
#endregion