日期:2014-05-18  浏览次数:20512 次

asp:table的问题
asp:table   里的内容是动态生成的,所以在每次page_load时都要重新初始化一遍。假定初始值a,我在改成b后,按button提交到服务器端。page_load完后是a值,但是到了button_click时变成了b值,值的改变是在什么时候(事件)进行的?


------解决方案--------------------
你可以去看看catchen的博客园里面的blog有关对动态控件的生命周期的深入论述
------解决方案--------------------
每当创建一个aspx,并且双击它,他就似乎产生了page_load事件处理程序。顺利成章,大家(不论是入门书还是入门的网络文章)就都把业务处理逻辑写在page_load里边。久而久之养成了习惯。

实际上,如果你写

if(!this.IsPostback)
{
......
}

这样的处理页面第一次装在时期的代码,把这个代码放到page_PreRender等其他事件中其结果也是一样的,为什么要放在page_load中呢?

我一直努力对page_load小心说明其postback时期的用途,我到处说真正的业务处理逻辑代码通常是在page_load之后的事件中执行的。在postback时,即IsPostback的值为true的时候,所要做的逻辑就是让页面的控件结构恢复上一次输出时的架构,而不是进行“初始化”。比如说,用户每按一次按钮就在table中动态产生新的一个tableRow,那么page_load在检测到是postback的时候,职责就是上一次页面输出时已经添加过几个tableRow,这一次就重建这几个。而不是“页面初始化”。


下面回答你的问题:

对于那些在设计代码中声明的控件,asp.net编译时产生的代码是在每一次执行page_init之前就已经动态产生它们了(也叫做静态装载),但是还没有状态值或者post值。然后在page_init之后,首先给它们装载状态ViewState值,然后装载客户端post提交的值,并且记录有关xxxxClick、xxxxChanged之类的事件。接下来执行page_load。在page_load中动态加载的控件,会在加载的同时(执行o.Controls.Add时)执行控件的Init、装载ViewState的工作,但是并不装载post值。在page_load结束之后,才给所有新动态加载的控件装载post值,并且记录好xxxClick、xxxChanged之类的事件。之后,将所有控件——不论是设计代码上声明的还是代码动态加载的,首先触发所有的xxxClick那一类事件(由于实现IPostbackEventHandler接口而处理的),然后触发所有的xxxChanged那一类事件(由于实现IPostDataHandler接口而处理的)。然后执行页面PreRender。最后执行页面Render。