在最近的一次采访中,提出了以下问题。
• A Master page which contains
• An ASPX web form page which contains
• A Web User Control inside the page which contains
• A button to fire some code in a button_click event
Init事件将触发(内部最多到外部最多)
aspx.page Begin Init
–> Inside user control Page_Init
–> Inside master page Page_Init
–> Inside lifecycle page Page_Init
aspx.page End Init
并启动加载事件
aspx.page Begin Load
–> Inside lifecycle page Page_Load
–> Inside master page Page_Load
–> Inside user control Page_Load
aspx.page End Load
为什么ASP.NET框架支持Load()
和Init()
中的不同执行顺序。这是面试中提出的问题。我不知道面试官对我的期望。
请求你的帮助。
答案 0 :(得分:10)
我建议您阅读ASP.NET page life cycle。
两者有不同的目的,因此执行顺序不同。
初始化:
在页面初始化期间,页面上的控件可用,并且每个控件的UniqueID属性都已设置。如果适用,还会对页面应用母版页和主题。如果当前请求是回发,则尚未加载回发数据,并且控制属性值尚未恢复为视图状态中的值。
负载:
在加载期间,如果当前请求是回发,则控制属性将加载从视图状态和控制状态恢复的信息。
此外,您需要了解母版页和内容页之间的relationship(母版页实际上包含在内容页面中,而不是相反)和complete life cycle of both。
因此,在init期间,需要首先初始化用户控件,因此它们可用于其容器,然后是主页,因此它的内容可用于内容页面,然后是页面本身,从而完成控件层次结构初始化。
在加载过程中,相反的情况发生了,因为现在已经设置了所有回发数据并且所有控件都已准备好并且可以触发它们的不同事件。顶部容器,首先加载内容页面(因为它可以更改母版页和用户控件),然后是主页面,最后是叶子控件。