ASP.NET是否使用反射来检查事件处理程序的存在?

时间:2011-12-13 15:39:00

标签: asp.net events reflection event-handling markup

我创建一个asp.net页面,例如Default.aspx的。

然后我定义了一个按钮......

<asp:Button ID="btnNew" runat="server" Text="New" OnClick="btnNew_OnClick" /> 

...但是我在代码中定义btnNew_OnClick的处理程序。

当我启动页面并抛出异常时,ASP.Net会告诉我这个。

因此,它是否使用反射来检查实现我的页面的类是否具有此方法?

如果每次解析页面的标记时都必须这样做,这是否有效?

3 个答案:

答案 0 :(得分:2)

不具体。这发生在ASP.NET compiles your ASPX markup时。 ASPX标记是在第一次动态点击页面时编译的,并存储在C:\WINDOWS\Microsoft.NET\Framework\vX\Temporary ASP.NET Files的某个位置。

例外情况是,如果您使用aspnet_compiler.exe预编译页面。但是,如果您要预编译它,那么您会看到错误,而不是当您访问该网站时。

  

如果每次解析页面的标记时都必须这样做,这是否有效?

ASP.NET没有解析每个页面视图上的标记并回发;它只是在编译时解析它一次。它存储了页面的哈希值(通常在临时ASP.NET文件中的某处称为hash.web)并比较哈希值。如果散列不同(页面已更改),则重新编译它。以下是编译代码的示例:

#line 58 "C:\X\UserControls\FilterControl.ascx"
@__ctrl.Click -= new System.EventHandler(this.btnApply_Click);

#line default
#line hidden

#line 58 "C:\X\UserControls\FilterControl.ascx"
@__ctrl.Click += new System.EventHandler(this.btnApply_Click);

这当然会被编译成可执行程序集。实际上,ASPX编译器正在做的是将服务器端标记编译为C#代码,然后编译成汇编。

答案 1 :(得分:1)

ASP.NET实际上使用ASPX标记作为排序模板,从页面生成一个降序的类。您可以在%WINDIR%\ Microsoft.NET \ v [FRAMEWORK VERSION] \ Temporary ASP.NET File下的文件夹中找到生成的类源代码。

我的理解是它生成一个实例化控件的类,并将事件处理程序连接到任何适用的方法。这就是为什么当您将事件处理程序设为私有时,事情会严重破坏 - 后代类无法访问它。

代码生成在前期非常昂贵;它是我们大多数asp.net开发人员所经历的漫长的asp.net热身的部分原因。但是,一旦应用程序升温,它就非常非常有效,因为所有内容都是通过编译代码呈现的。

答案 2 :(得分:0)

不,它不使用反射。正如@Wyatt Barnett所说,编译器会为此生成代码。生成的代码与您自己注册事件的代码相同。

btnNew.Click += new EventHandler(btnNew_Click);

当生成标记的代码时,它与性能相同,可能除了第一次调用之外。