我创建一个asp.net页面,例如Default.aspx的。
然后我定义了一个按钮......
<asp:Button ID="btnNew" runat="server" Text="New" OnClick="btnNew_OnClick" />
...但是我不在代码中定义btnNew_OnClick的处理程序。
当我启动页面并抛出异常时,ASP.Net会告诉我这个。因此,它是否使用反射来检查实现我的页面的类是否具有此方法?
如果每次解析页面的标记时都必须这样做,这是否有效?
答案 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);
当生成标记的代码时,它与性能相同,可能除了第一次调用之外。