我正在做的一个东东(保密*_*)里面用到了Asp.NET控件的动态加载,也就是通过TemplateControl.LoadControl(string virtualPath)方法动态将控件加载到页面,可是确碰到了一个问题,就是子控件的页面状态恢复不了,症状是这个样子的:用户控件中的TextBox等简单控件的状态可以恢复,可是DropDownList、TreeView等的页面状态却恢复不了,按照以前的经验仔细检查了一边又一边,问题还是解决不了。

1.控件在Add到父控件时正确设置了ID,而且Postback前后的ID一致;

2.控件是在Page的Init事件中加载的,这样子的话,不管在控件加入前或后添加DropDownList的Item,页面状态都应该正确保存,因为TrackViewState在Init事件之后执行,按照控件生命周期的追赶原则(动态控件一开始是新建对象,处于原始状态,当它被加到父控件的Controls里时,父控件会根据其当前的control阶段来调用该子控件的一些方法,让子控件赶上父控件的control阶段),没有必要象在Load事件中加载那样,必须控件添加到父控件后再添加子项;

头大了,只好翻出Reflactor来,查看.NET Framework的源码了,原来Asp.NET里的控件的LoadViewStateByID属性默认为false,页面状态按照控件位置加载,而非ID,唉,搞了我一个晚上,在基类加上ViewStateModeById元数据属性,OK了,hoho~,记一下,免得以后忘了。顺付Asp.NET2.0控件生命周期:

1。Instantiate
2。Initialize
3。Begin Tracking View State
4。Load View State (postback only)
5。Load Postback Data (postback only)
6。Load
7。Raise Changed Events (postback only, optional)
8。Raise Postback Events (postback only, optional)
9。PreRender
10。SaveViewState
11。Render
12。Unload
13。Dispose

posted on 2007-08-25 13:53  XOrb  阅读(445)  评论(0编辑  收藏  举报