一周前我接受了一次采访,其中一个问题是ASP.NET中的OnInit和Onload之间的区别是什么?我没有任何线索,我没有在网上找到任何简单的答案,所以有人可以解释一下,简单的两者之间的区别是什么? (我发现的是生命周期中的差异很大。)
答案 0 :(得分:25)
OnInit
(Init
事件)在所有控件初始化后但在启用ViewState
跟踪之前发生。它被称为自下而上(子控件的Init
事件在其父项Init
事件之前被调用。
Init
是向页面或用户控件添加动态控件的好地方(尽管不是必需的)。如果可以,那么这些控件将在回发期间自动恢复ViewState
(见下文)。但是,设置控件属性是一个危险的地方,因为它们可以被传入的ViewState
覆盖。 Init
是设置ViewStateUserKey
的正确位置,可以帮助保护您的网站免受一键攻击。如果你正在使用控制状态,你也可以从那里打电话给RegisterRequiresControlState()
。
在Init
事件发生后,每个控件都会启用ViewState
跟踪,因此在此之后对控件属性的任何更改都将反映在ViewState
中。
页面级别的下一个事件是InitComplete
和PreLoad
,这两个事件在控件级别都不可见。在回发期间,传入的ViewState
会恢复为InitComplete
和PreLoad
之间的控制。
然后是Load
事件,它发生在控件和页面上。首先在父级别调用Load
,然后在任何子控件中调用{{1}}。主页面的行为类似于页面上关于事件排序的控件。
答案 1 :(得分:18)
您需要阅读ASP.NET page lifecycle。
OnInit
在生命周期的早期发生 - 视图状态更改尚未完成,并且尚未对其进行跟踪。
答案 2 :(得分:5)
Page_Init
之前提出 Page_Load
。 Page_Init
是您在进一步处理之前要执行的代码的好地方,例如将事件处理程序附加到load事件。
最好不要在此事件中访问控件,因为您无法保证已创建。
Page_Load是存储代码的好地方,您可以在其中初始化值以及特定于页面的任何控件,因为此时您知道控件存在且可用。
对于大部分应用,您将在Page_Load中放置比在Page_Init中更多的代码
答案 3 :(得分:0)
ASP.NET调用Control类的这两种方法。 OnInit()
方法引发Init
事件,OnLoad()
方法引发Load
事件。