Microsoft ASP.NET Web Forms 中的 AutoEventWireup 属性






3.58/5 (50投票s)
Microsoft ASP.NET Web Forms 中的 AutoEventWireup 属性简介。
引言
ASP.NET 支持两种编写页面的方法
- 内联代码
- 后台代码
内联代码是直接嵌入在 ASP.NET 页面中的代码。代码隐藏是指包含在单独类文件中的 ASP.NET 页面的代码。这允许干净地分离 HTML 与表示逻辑。
当我们使用 Microsoft Visual Studio .NET 创建 ASP.NET Web Forms 时,默认方法是代码隐藏页面。此外,Visual Studio .NET 在我们构建解决方案时会自动为我们执行预编译。
一点背景知识
ASP.NET 中的指令控制页面和用户控件编译器的设置和属性。它们可以包含在页面中的任何位置,尽管标准做法是将它们放在开头。指令同时用于 .aspx 文件(ASP.NET 页面)和 .ascx 文件(用户控件页面)。ASP.NET 页面实际上支持八种不同的指令。
@ Page
@ Control
@ Import
@ Implements
@ Register
@ Assembly
@ OutputCache
@ Reference
Page 指令是最常用的指令,用于编辑控制页面解析器和页面编译器如何工作的各种设置。以下是 ASP.NET 中一些更常用的页面指令属性列表。
@ Page language="c#" Codebehind="WebForm1.aspx.cs"
AutoEventWireup="false" Inherits="TestWebApp.WebForm1"
Language
指示在 ASP.NET 页面中编写内联脚本代码的语言(位于<% %>
标签之间的代码)。此属性的值可以是C#
、VB
或JS
。Codebehind
指示用作此 ASP.NET 页面支持文件的文件名。此文件应反映Language
设置;也就是说,如果使用的语言是 C#,则 CodeBehind 文件应具有 .cs 扩展名并用 C# 编写。Inherits
指示此 ASP.NET 页面应从中继承的限定类名。通常,这将是代码隐藏文件中描述的类的名称。AutoEventWireup
是一个布尔属性,指示是否自动连接 ASP.NET 页面的事件。
注意:在上述情况下,ASP.NET 会动态编译代码隐藏页面。我们必须注意,此编译步骤仅在代码隐藏文件更新时发生。文件是否已更新,这通过时间戳更改来检测。
进入正题
AutoEventWireup
属性的值可以是 true
或 false
。当使用 Microsoft Visual Studio .NET 创建 ASP.NET Web 应用程序时,AutoEventWireup
属性的值设置为 false
。
我们可以在以下位置指定 AutoEventWireup
属性的默认值
- Machine.config 文件。
- Web.config 文件。
- 单独的 Web Forms (.aspx 文件)。
- Web 用户控件 (.ascx 文件)
可以在 Machine.config 文件或 Web.config 文件中的 <pages>
部分声明 AutoEventWireup
属性的值,如下所示:
<configuration> <system.web> <pages autoEventWireup="true|false"
/> </system.web> </configuration>
如果您在 Machine.config 文件中进行这些更改,这些更改将影响计算机上的所有 ASP.NET Web Forms。如果您在 Web.config 文件中进行这些更改,这些更改将仅影响该文件所属的应用程序。但是,要仅对单个 Web Forms 进行更改,我们必须将 AutoEventWireup
属性添加到 @ Page
指令中,如上所示。
查看代码
当我们创建新的 ASP.NET Web 应用程序在 Visual Studio .NET 中,如前所述,默认情况下,AutoEventWireup
属性的值在 .aspx 页面中设置为 false
,并且会自动创建事件处理程序。我们可以在 InitializeComponent
方法中找到它。
this.Load += new System.EventHandler(this.Page_Load);
查看此属性工作方式的最佳方法是:
- 在 WebForm1.aspx.cs 中将
string
变量msg
声明为public
。 - 在 WebForm1.aspx 的 HTML 部分,在
<Head>
部分输入以下代码:<% Response.Write(msg); %>
在
Page_Load
中,您可以为声明的变量msg
输入一个值。msg= "We are in Page_Load()";
运行应用程序时,您将收到消息 We are in Page_Load() [下称消息]。注意:这是在属性设置为 false
的默认情况下。
现在尝试注释掉 aspx.cs 文件中 Page_Load
的事件处理程序代码;并将 AutoEventWireup
属性在 .aspx 页面中设置为 false
。这次运行应用程序时,您将收不到消息。
现在,在 aspx.cs 文件中 Page_Load
的事件处理程序代码仍然被注释掉的情况下;将 AutoEventWireup
属性在 .aspx 页面中设置为 true
。这次运行应用程序时,您将收到消息。
原因:当 AutoEventWireup
属性设置为 false
(默认)时,会自动为 Page_Load
或 Page_Init
需要事件处理程序。但是,当我们将其值设置为 true
时,ASP.NET 运行时不需要事件来指定事件处理程序,例如 Page_Load
或 Page_Init
。
需要注意的一点是,Page
指令的 AutoEventWireup
属性在机器上默认设置为 true
(查看 machine.config 中此属性的值),但在 .aspx 页面上默认设置为 false
。因此,如果它缺失,由于默认值为 true
(即在机器级别),页面框架会自动调用页面事件,特别是 Page_Init
和 Page_Load
方法。在这种情况下,不需要显式的 Handles
子句或委托。
性能问题
如果性能是关键考虑因素,我们不应将 AutoEventWireup
属性的值设置为 true
。如果我们将其值设置为 true
,ASP.NET 页面框架必须为每个 Web Forms(.aspx 页面)调用 CreateDelegate
方法,并且而不是依赖自动连接,而是手动覆盖页面中的事件。
致谢
整个过程其实很简单,但我只是想把它发到网上;希望它能帮助到一些人。为了将功劳归于应得者。大部分信息是从网上不同地方搜集来的。我只是将它们整理在一起,并添加了一些我自己的内容来帮助大家。我还找到了 MSDN 在线的一篇与此相关的文章(文章 ID:317690),但它是针对 VB.NET 的。