56

我不明白AutoEventWireUp页面属性负责什么。

我已经阅读了这篇文章,但即使是我也不明白。

4

3 回答 3

63

当请求页面时,它会引发各种事件,这些事件被认为是其生命周期的一部分。我将Peter Bromberg 创建的视觉表示随身携带。

AutoEventWireUp属性为 True 时,会自动将 Page 生命周期中的一些内置事件连接到它们的处理程序。这意味着您不需要显式附加这些事件(例如,在 VB 中使用 Handles 关键字)。

这些内置事件的示例是Page_InitPage_Load

如果您设置AutoEventWireUp为 True提供 EventHandlers 的显式连接,您会发现它们被执行了两次!false这是 Visual Studio默认将此属性设置为的原因之一。

编辑:(在 Chester89 的评论之后)


需要注意的是, AutoEventWireUpPage 的属性的默认值为 ,而Page 类true的属性的默认值为AutoEventWireUpfalse

于 2009-03-25T09:54:18.087 回答
27

添加到以前的答案;自动挂钩从 应用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,或者如果它不存在,OnTransactionAbort
    • Page_CommitTransaction,或者如果它不存在,OnTransactionCommit

System.Web 4.0 版Page_PreRenderCompleteAsync为从 Page 派生的所有类引入了一个。该方法(如果存在)将使用Page.RegisterAsyncTask注册并在“PreRenderComplete 事件之前”自动执行(来源:Page.ExecuteRegisteredAsyncTasks)。此方法似乎非常无证,这表明最好只使用您自己的方法调用Page.RegisterAsyncTask 。

于 2009-03-25T10:16:23.603 回答
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

于 2009-03-25T09:51:15.863 回答