Welcome 微信登录

首页 / 网页编程 / ASP.NET / ASP.NET自定义控件 第三天 使用控件状态的星级控件

ASP.NET自定义控件 第三天 使用控件状态的星级控件2011-09-02 博客园 holywolf引言

正如在前两个任务中所看到的,我们使用视图(ViewState)保存自定义控件 属性,ViewState实际上是一个StateBag对象,开发人员使用键/值的方法向视图 中保存或读取设置,最终发送给用户的HTML页面中会包含一个隐藏域,该隐藏域 中保存了经过序列化后的值。如果过分使用视图的话,会导致页面急剧增大,虽 然现在网络带宽已经不是限制条件,但这仍然是一个不太好的设计,因此开发人 员有时会禁用视图状态。

对于自定义控件来说,如果禁用视图状态可能导致控件不能够正常工作,读者 可以使用第一次任务里开发的星级控件,禁用页面的视图状态(设置Page指令 EnableViewState属性为false)并在在页面的加载(Page_Load)事件里输入如下 代码以设置分数:

protected void Page_Load(object sender, EventArgs e){  if (!IsPostBack)    star.Score = 4;}
并在ASPX页面上放置一个服务器端按钮以引起回发事件,预览该页面并点击按 钮,会发生什么情况?由于提交按钮引起回发IsPostBack属性为true,即不会执 行分数设置操作,并且因为禁用了视图状态,在页面生命周期里运行时无法从视 图状态中恢复分数,所以会导致没有分数:

图3-1 禁用了视图状态的自定义控件

分析

在.NET1.X版本里,视图状态被作为一个整体,要不允许要么禁止,对于控件 开发人员来说非常不方便,与控件相关的数据放置在ViewState里,一旦被禁用后 ,可能就会出问题。比较幸运的是,对于这种情况,微软及时做出了反应。在 ASP.NET2.0里,出现了一个新的概念——控件状态。

控件状态实际上是一种特殊的视图状态,它仍然保存在客户端的隐藏域中,但 是它并不会受视图状态启用/禁用的影响,也就是说,即使将ViewState禁用,运 行时仍然能正确的恢复在控件状态中保存的数据。

为了使用控件状态,仅仅需要做额外的几个工作:

1. 向页面注册使用控件状态

2. 在控件状态保存事件(Control类的SaveControlState方法)中保存相关数 据

3. 在控件状态读取事件(Control类的LoadControlState方法)中读取保存的 数据

需要说明的一点是,正因为控件状态始终都会发送到客户端,所以将大量数据 保存到控件状态中显然不是一件太好的事件,始终应该只保存影响控件使用的关 键的核心的数据。

为了能够使页面视图状态被禁止后控件仍然能够正常使用,将星级控件的得分 保存在控件状态中。