微妙的 ASP.NET 控件事件顺序

作者:vkvi 来源:ITPOW(原创) 日期:2011-8-9
  • 有一个用户控件,放在 DetailsView 中;
  • DetailsView 放在页面中;
  • 页面Page_PreRender 中通过指定 DateSource、调用 DataBind 的方法来填充数据。

我们用 p 代表页面、c 代表用户控件;用 l 代表 Load 事件,用 r 代表 PreRender 事件。

其中 pr 有两个:一个是指定 DataSource、调用 DataBind 之前,一个是之后。

首次进入

pl -> pr -> cl -> pr

或者

pl -> pr -> pr -> cl(后两者由于是异步的,谁不准谁先谁后)

可以看出,首次进入时,直到 DataBind 被调用之后,才有用户控件的事,因为之前 DetailsView 并没有被创建,其中的用户控件肯定没出来。有人可能会问 ASP.NET 页面事件执行顺序不是说页面 Load 完了,控件 Load,控件 Load 完了页面 PreRender 么,这里怎么不是?这里就不要死读书了。

回传后进入

pl -> cl -> pr -> cl -> pr

由于回传,启用了 ViewState,这个控件就在页面的 Load 后面出来了,但后来绑定了一次 DetailsView,所以又 Load 了一次。

问一问,用户控件的 PreRender 是不是也被调用两次呢?不是,只有一次,为什么呢?因为控件的 PreRender 是在页面的 PreRender 之后才显示的,而 页面中的 PreRender 绑定了 DetailsView,此时用户控件会被重新创建。

相关阅读

相关文章