4

AutoEventWireup使用反射搜索页面方法page_eventName

微软

当 AutoEventWireup 为 true 时,处理程序会在运行时根据其名称和签名自动绑定到事件。对于每个事件,ASP.NET 搜索根据 Page_eventname 模式命名的方法,例如 Page_Load 或 Page_Init。

问题 :

他对每个请求都这样做吗?

我查看了temporary internet files(atMicrosoft.net文件夹...),看看他是否保存了另一个包含显式处理程序附件的文件 - 并且找不到任何 .

4

1 回答 1

4

正如@Marc 所说,ASP.NET 似乎为此使用了缓存。见内部TemplateControl.HookUpAutomaticHandlers

此方法的一部分使用dotPeek

internal void HookUpAutomaticHandlers()
{
  ...
  object obj = TemplateControl._eventListCache[(object) this.GetType()];
  if (obj == null)
  {
    lock (TemplateControl._lockObject)
    {
      obj = TemplateControl._eventListCache[(object) this.GetType()];
      if (obj == null)
      {
        IDictionary local_1_1 = (IDictionary) new ListDictionary();
        this.GetDelegateInformation(local_1_1);
        obj = local_1_1.Count != 0 ? (object) local_1_1 : TemplateControl._emptyEventSingleton;
        TemplateControl._eventListCache[(object) this.GetType()] = obj;
      }
    }
  }
  ...

私有GetDelegateInformation方法负责为控件创建委托。 TemplateControl._eventListCache是一个Hashtable持有每个模板控件的委托。

所以,回答你的问题:

他对每个请求都这样做吗?

答案是不。ASP.NET 执行一次来填充 this Hashtable,然后使用缓存的值。

于 2012-11-14T14:13:52.687 回答