服务器控件编程中的控件状态保存机制

服务器控件(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

原文地址:https://www.cnblogs.com/chenxizhang/p/1427827.html