我们用 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,此时用户控件会被重新创建。
相关阅读