1

我的面条有一种感觉的火花。我正在浏览我的 ASP.NET 页面,我注意到

等等,Page_Load 不等于类的名称,因此它不能是我的 aspx.cs 页面上我的类的构造函数

我有一种直觉,AutoEventWireup="true"负责告诉页面默认情况下调用该protected void Page_Load(object sender, EventArgs e)方法。问题(和疑问)是我不知道如何或在哪里可以查看哪些事件连接到哪些处理程序。我确信AutoEventWireup="true"某处有这个片段:

this.Load += this.Page_Load

我只是在寻求扩展我对此的了解。我在哪里可以看到 AutoEventWireup 正在“连接”哪些事件?

编辑

我在尝试进行虚拟构造函数调用后发现了这个想法(我在代码隐藏中创建了一个构造函数,因为我不小心删除Page_Load了 .Resharper 建议我必须密封该类。我认为这是不常见的行为。仔细检查了另一个页面,然后复制粘贴了我的Page_Load背部。这就是我想知道事件实际上是如何连接的。ASP.NET 是如何知道它必须调用的Page_Load

4

1 回答 1

2

这是针对 .NET 4 的,其他框架会略有不同,但使用 Reflector 时,您会发现TemplateControlwhichPageUserControlboth inherit 都有一个GetDelegateInformationWithNoAssert连接这些委托的私有方法。

private void GetDelegateInformationWithNoAssert(IDictionary dictionary)
{
    if (this is Page)
    {
        this.GetDelegateInformationFromMethod("Page_PreInit", dictionary);
        this.GetDelegateInformationFromMethod("Page_PreLoad", dictionary);
        this.GetDelegateInformationFromMethod("Page_LoadComplete", dictionary);
        this.GetDelegateInformationFromMethod("Page_PreRenderComplete", dictionary);
        this.GetDelegateInformationFromMethod("Page_InitComplete", dictionary);
        this.GetDelegateInformationFromMethod("Page_SaveStateComplete", dictionary);
    }
    this.GetDelegateInformationFromMethod("Page_Init", dictionary);
    this.GetDelegateInformationFromMethod("Page_Load", dictionary);
    this.GetDelegateInformationFromMethod("Page_DataBind", dictionary);
    this.GetDelegateInformationFromMethod("Page_PreRender", dictionary);
    this.GetDelegateInformationFromMethod("Page_Unload", dictionary);
    this.GetDelegateInformationFromMethod("Page_Error", dictionary);
    if (!this.GetDelegateInformationFromMethod("Page_AbortTransaction", dictionary))
    {
        this.GetDelegateInformationFromMethod("OnTransactionAbort", dictionary);
    }
    if (!this.GetDelegateInformationFromMethod("Page_CommitTransaction", dictionary))
    {
        this.GetDelegateInformationFromMethod("OnTransactionCommit", dictionary);
    }
}

如果您遵循此方法的用法,您将看到它被调用,并且此方法仅在为 trueHookUpAutomaticHandlers时附加委托。SupportAutoEvents

于 2013-10-24T08:16:35.030 回答