ASP.NET服务器控件之控件状态
InControlState); } } else { return obj; } } //重写LoadControlState方法,加载控件状态数据 protected override void LoadControlState(object state) { if (state != null) { Pair p = state as Pair; if (p != null) { base.LoadControlState(p.First); _indexInControlState = (int)p.Second; } else { if (state is int) { _indexInControlState = (int)state; } else { base.LoadControlState(state); } } } } } } 如上代码实现了一个继承自Button基类的IndexButton控件,其中包括属性IndexControlState和IndexInViewState。根据代码实现可知,IndexInViewState属性利用了视图状态来存储值,而Index属性利用了控件状态来存储值。前者的实现非常简单,在此不再说明。后者的实现主要通过完成以下三个步骤,才使控件参与控件状态。 (1)重写OnInit方法并调用RegisterRequiresControlState方法向页面注册,以参与控件状态。需要注意的是:必须针对每个请求完成此任务。 (2)重写SaveControlState方法,以在控件状态中保存数据。 (3)重写LoadControlState方法,以从控件状态加载数据。此方法调用基类方法,并获取基类对控件状态的基值。如果_indexInControlState字段不为零,而且基类的控件状态也不为空,Pair类便可作为方便的数据结构使用,用来保存和还原由两部分组成的控件状态。 读者可以回想一下前一篇介绍视图状态文章中的示例。其中同样也定义了两个属性,一个是采用视图状态构建的TextInViewState属性,另一个是使用私有变量实现的Text属性。前者TextInViewState属性与上文示例中的IndexInViewState属性的实现方法几乎完全相同,其无非是利用ViewState存储属性值而已。然而,后者Text属性与上文示例的IndexInControlState属性虽然有些类似,例如,二者在实现过程中都使用了私有变量,但是,二者的本质不同。Text使用的是私有变量,而IndexInControlState使用的是控件状态,其关键是通过OnInit方法启用了控件状态功能,并重写SaveControlState和LoadControlState方法,以便自定义控件状态数据的保存和加载过程。建议读者在阅读本文的同时,也能够注意到本段所述内容。这对于理解视图状态和控件状态概念有着重要意义。 下面列举了为测试IndexButton控件而创建的Default.aspx页面源代码。
|
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |