网上有很多关于 asp.net 生命周期的文章,不过都是千篇一律,出自于同一篇文章。
看了之后有几点不明白的地方:
1、对于文章中第二点(加载视图状态数据)的疑惑。
该断大致意思是,在LoadViewState事件中,已初始化的控件获得第一个属性:上一次提交存留到服务器的视图状态信息。
文章中说可以通过 LoadViewState方法重载,为了验证 ViewState 是在该事件中被加载的,我就重载了 LoadViewState方法,想办法把所有的 ViewState清空,用了很多方法(可能都是错误的)比如ViewState.Clear ();this.ClearChildViewState ();但是都不行,不知道什么原因,我随便按了一个按钮,保存在 Repeater 控件里的值还是不变,也就是 ViewState没有被删除。2、对于文章中的第三点(LoadPostData处理回传数据)
该断大致都明白了,就是用用户提交的数据来更新控件状态,该控件必须是实现了IPostBackDataHandler接口,比如 TextBox。但也有一点不明白的,如果我把 TextBox的EnableViewState设为 false ,当页面回传时,TextBox 的值也是能被保存的,相信应该就是在这阶段被更新保存的,可是这样一来 TextBox 的 EnableViewState 还有什么意义,永远都设为 false 不是更好?3、文章中的第五点(激发RaisePostDataChanged 事件)
在文章中的第三点说道LoadPostData事件被激发后,RaisePostDataChanged事件就可以随时被执行了。
不明白的是在 RaisePostDataChanged事件中到底可以做什么,RaisePostDataChanged好像不是虚拟的。4、文章中的第六点(处理客户端回传事件)
文章中说道:当回传更新导致数据改变而引发服务器端事件后,引发回传的对象会在RaisePostBackEvent事件中被处理。这种激发回传的对象往往是其状态改变而引发回传的控件(其autopostback被启用)或者是一个被点击的窗体提交按钮。
我断点跟踪了 protected override void RaisePostBackEvent,发现如果单击一个 Button确实会引发RaisePostBackEvent事件,之后 执行Button_Click事件。但 DropDownList确不会触发该事件(AutoPostBack以设为 true),相信是 DropDownList 没有继承 IPostBackDataHandler,可这样一来
DropDownList 的 SelectedIndexChanged事件又是如何激发的呢?
看了之后有几点不明白的地方:
1、对于文章中第二点(加载视图状态数据)的疑惑。
该断大致意思是,在LoadViewState事件中,已初始化的控件获得第一个属性:上一次提交存留到服务器的视图状态信息。
文章中说可以通过 LoadViewState方法重载,为了验证 ViewState 是在该事件中被加载的,我就重载了 LoadViewState方法,想办法把所有的 ViewState清空,用了很多方法(可能都是错误的)比如ViewState.Clear ();this.ClearChildViewState ();但是都不行,不知道什么原因,我随便按了一个按钮,保存在 Repeater 控件里的值还是不变,也就是 ViewState没有被删除。2、对于文章中的第三点(LoadPostData处理回传数据)
该断大致都明白了,就是用用户提交的数据来更新控件状态,该控件必须是实现了IPostBackDataHandler接口,比如 TextBox。但也有一点不明白的,如果我把 TextBox的EnableViewState设为 false ,当页面回传时,TextBox 的值也是能被保存的,相信应该就是在这阶段被更新保存的,可是这样一来 TextBox 的 EnableViewState 还有什么意义,永远都设为 false 不是更好?3、文章中的第五点(激发RaisePostDataChanged 事件)
在文章中的第三点说道LoadPostData事件被激发后,RaisePostDataChanged事件就可以随时被执行了。
不明白的是在 RaisePostDataChanged事件中到底可以做什么,RaisePostDataChanged好像不是虚拟的。4、文章中的第六点(处理客户端回传事件)
文章中说道:当回传更新导致数据改变而引发服务器端事件后,引发回传的对象会在RaisePostBackEvent事件中被处理。这种激发回传的对象往往是其状态改变而引发回传的控件(其autopostback被启用)或者是一个被点击的窗体提交按钮。
我断点跟踪了 protected override void RaisePostBackEvent,发现如果单击一个 Button确实会引发RaisePostBackEvent事件,之后 执行Button_Click事件。但 DropDownList确不会触发该事件(AutoPostBack以设为 true),相信是 DropDownList 没有继承 IPostBackDataHandler,可这样一来
DropDownList 的 SelectedIndexChanged事件又是如何激发的呢?
都没一个连接啊?
我不是太懂不过有本书应该值得去看看<ASP.NET服务器控件与组件开发>
http://dev.csdn.net/Develop/article/18/article/18/18085.shtm
拿"EnableViewState"来说吧:
请做这样一个实验:
1、建立一个Web工程,在WebForm1.aspx中
加入两个TextBox(TextBox1,TextBox2)一个Button(Button)
2、修改属性
TextBox1:Width=200px、EnableViewState=true
TextBox2:Width=200px、EnableViewState=false
3、在WebForm1.aspx.cs的Page_Load中加入下列代码
if(!this.IsPostBack)
{
this.TextBox1.Width=100;
this.TextBox2.Width=100;
}
4、运行
1)、请观察两个文本框的宽度
2)、按Button1后再观察两个文本框的宽度
5、请再读一个对EnableViewState的注释
如果服务器控件维护自己的视图状态,则为 true;否则为 false。默认为 true。
1、比如在 LoadViewState事件或者 SaveViewState中,可不可以控制 ViewState 的大小,即只保存有用的数据去除一些没用的数据,如果直接把 EnableViewState设为 false 的话,绝大部分对该控件的操作就失效了。
2、就如bugsbuddy(兔兔鞋)所说的,控件实现了IPostBackEventHandler接口就会调用此控件的RaisePostBackEvent函数,由此函数遍历控件的相关事件。但那些没有实现 IPostBackEventHandler接口的控件比如 DropDownList是如何触发 SelectedIndexChanged事件的?
不错,值得推荐
DropDownList也实现IPostBackEventHandler接口了呀.