我不明白AutoEventWireUp页面属性负责什么。
我已经阅读了这篇文章,但即使是我也不明白。
当请求页面时,它会引发各种事件,这些事件被认为是其生命周期的一部分。我将Peter Bromberg 创建的视觉表示随身携带。
该AutoEventWireUp属性为 True 时,会自动将 Page 生命周期中的一些内置事件连接到它们的处理程序。这意味着您不需要显式附加这些事件(例如,在 VB 中使用 Handles 关键字)。
这些内置事件的示例是Page_Init和Page_Load。
如果您设置AutoEventWireUp为 True并提供 EventHandlers 的显式连接,您会发现它们被执行了两次!false这是 Visual Studio默认将此属性设置为的原因之一。
编辑:(在 Chester89 的评论之后)
需要注意的是, AutoEventWireUpPage 的属性的默认值为 ,而Page 类true的属性的默认值为AutoEventWireUpfalse
添加到以前的答案;自动挂钩从 应用TemplateControl.HookUpAutomaticHandlers。此方法调用TemplateControl.GetDelegateInformationWithNoAssert其中包含哪些方法被视为事件处理程序。
在 System.Web 2.0 版中,这些是:
在从 Page 派生的所有类上:Page_PreInit, Page_PreLoad, Page_LoadComplete, Page_PreRenderComplete, Page_InitComplete, Page_SaveStateComplete.
在从 TemplateControl 派生的所有类上:Page_Init, Page_Load, Page_DataBind, Page_PreRender, Page_UnLoad, Page_Error.`
对从 TemplateControl 派生的所有类的事务支持:
Page_AbortTransaction,或者如果它不存在,OnTransactionAbortPage_CommitTransaction,或者如果它不存在,OnTransactionCommitSystem.Web 4.0 版Page_PreRenderCompleteAsync为从 Page 派生的所有类引入了一个。该方法(如果存在)将使用Page.RegisterAsyncTask注册并在“PreRenderComplete 事件之前”自动执行(来源:Page.ExecuteRegisteredAsyncTasks)。此方法似乎非常无证,这表明最好只使用您自己的方法调用Page.RegisterAsyncTask 。
正如文章中提到的,如果你打开了 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。