我不明白AutoEventWireUp
页面属性的责任。
在网上冲浪时,我发现很多论坛都有关于它的讨论,而且它们对我来说都是不一致的。
我能否清楚解释这个属性究竟意味着什么?
我已阅读this article,但即使我不理解。
答案 0 :(得分:57)
当请求页面时,它会引发各种被认为是lifecycle的一部分的事件。我把Peter Bromberg创造的visual representation放在我身边。
True时的AutoEventWireUp
属性会自动将页面生命周期中的一些内置事件连接到其处理程序。这意味着您不需要显式附加这些事件(例如,使用Handles关键字,在VB中)。
这些内置事件的示例包括Page_Init
和Page_Load
。
如果您将AutoEventWireUp
设置为True 并且提供EventHandler的显式连接,您会发现它们被执行了两次!这是默认情况下Visual Studio将此属性设置为false
的原因之一。
编辑:(在Chester89的评论之后)
值得注意的是,Page的AutoEventWireUp
属性的默认值为true
,而Page类的AutoEventWireUp
属性的默认值为{{1 }}
答案 1 :(得分:27)
添加到以前的答案;自动挂钩从TemplateControl.HookUpAutomaticHandlers
应用。此方法调用TemplateControl.GetDelegateInformationWithNoAssert
,其中包含哪些方法被视为事件处理程序。
这些是在System.Web中的2.0版:
在源自Page:Page_PreInit
,Page_PreLoad
,Page_LoadComplete
,Page_PreRenderComplete
,Page_InitComplete
,Page_SaveStateComplete
的所有类中。< / p>
在从TemplateControl派生的所有类中:Page_Init
,Page_Load
,Page_DataBind
,Page_PreRender
,Page_UnLoad
,Page_Error
。
从TemplateControl派生的所有类的事务支持:
Page_AbortTransaction
,或者如果它不存在,OnTransactionAbort
Page_CommitTransaction
,或者如果它不存在,OnTransactionCommit
System.Web 4.0版为从Page派生的所有类引入了Page_PreRenderCompleteAsync
。该方法(如果存在)将使用Page.RegisterAsyncTask进行注册,并在“PreRenderComplete事件之前”自动执行(来源:Page.ExecuteRegisteredAsyncTasks)。这种方法似乎没有记录,这表明它更倾向于用你自己的方法调用Page.RegisterAsyncTask。
答案 2 :(得分:11)
正如文章中提到的,如果你打开了AutoEventWireUp,asp.net会自动识别你有一个带有page_load语法的方法并自动调用它:
private void Page_Load(object sender, System.EventArgs e)
{
}
这为您提供了一个更清晰的代码,代价是一些(非常)小的开销。请注意,如果您没有指定它,则必须明确告诉asp.net您要处理页面加载事件:
this.Load += new System.EventHandler(this.Page_Load);
请注意,这适用于页面中的其他事件,因为它使用命名约定为 Page_Event 。