本文节选自《庖丁解牛:纵向切入ASP.NET 3.5控件和组件开发技术》一书
在控件开发时,有时候需要清除子控件的页面状态,比如在创建子控件时,以下是一个在数据绑定时清除视图并创建子控件的应用场景:
/// <summary>
/// 获得本书更多内容,请看:
/// http://blog.csdn.net/ChengKing/archive/2008/08/18/2792440.aspx
/// </summary>
public override void DataBind()
{
base.OnDataBinding(EventArgs.Empty);
Controls.Clear();
ClearChildViewState(); //清理视图状态
TrackViewState();
CreateControlHierarchy(true);
ChildControlsCreated = true;
}
本节介绍几个清理页面状态的方法,主要由Control基类提供。
1.HasChildViewState方法
获取一个值,该值指示当前服务器控件的子控件是否具有任何已保存的视图状态设置。如果有任何子控件具有已保存的视图状态信息,则返回true;否则返回false。
2.IsChildControlStateCleared方法
获取一个值,该值指示当前控件中包含的控件是否具有控件状态。如果该控件的子级不使用控件状态,则返回true;否则返回false。
3.ClearChildState方法
同时清除子控件的视图状态和控件状态。其方法体如下:
protected void ClearChildState()
{
this.ClearChildControlState();
this.ClearChildViewState();
}
4.ClearChildControlState方法
清除控件状态。其代码如下:
protected void ClearChildControlState()
{
if (this.ControlState >= ControlState.Initialized)
{
this.flags.Set(0x40000);
if (this.Page != null)
{
this.Page.RegisterRequiresClearChildControlState(this);
}
}
}
控件状态是通过方法:
Page.RegisterRequiresControlState(this);
将控件注册为具有持久性控件状态的控件。同时也要调用方法:
this.Page.RegisterRequiresClearChildControlState(this);
清除控件状态,不同的是:此方法是内部方法。不供开发人员调用,只能通过ClearChild ControlState方法间接调用。
5.ClearChildViewState方法
此方法主要清除子控件的视图状态,其代码结构如下:
protected void ClearChildViewState()
{
if (this._occasionalFields != null)
{
this._occasionalFields.ControlsViewState = null;
}
}
方法体中设置控件视图状态的IDictionary对象ControlsViewState为null。
···
···