65.9K
CodeProject 正在变化。 阅读更多。
Home

Microsoft ASP.NET Web Forms 中的 AutoEventWireup 属性

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.58/5 (50投票s)

2005年1月27日

CPOL

5分钟阅读

viewsIcon

248327

Microsoft ASP.NET Web Forms 中的 AutoEventWireup 属性简介。

引言

ASP.NET 支持两种编写页面的方法

  1. 内联代码
  2. 后台代码

内联代码是直接嵌入在 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#VBJS
  • Codebehind 指示用作此 ASP.NET 页面支持文件的文件名。此文件应反映 Language 设置;也就是说,如果使用的语言是 C#,则 CodeBehind 文件应具有 .cs 扩展名并用 C# 编写。
  • Inherits 指示此 ASP.NET 页面应从中继承的限定类名。通常,这将是代码隐藏文件中描述的类的名称。
  • AutoEventWireup 是一个布尔属性,指示是否自动连接 ASP.NET 页面的事件。

注意:在上述情况下,ASP.NET 会动态编译代码隐藏页面。我们必须注意,此编译步骤仅在代码隐藏文件更新时发生。文件是否已更新,这通过时间戳更改来检测。

进入正题

AutoEventWireup 属性的值可以是 truefalse。当使用 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_LoadPage_Init 需要事件处理程序。但是,当我们将其值设置为 true 时,ASP.NET 运行时不需要事件来指定事件处理程序,例如 Page_LoadPage_Init

需要注意的一点是,Page 指令的 AutoEventWireup 属性在机器上默认设置为 true(查看 machine.config 中此属性的值),但在 .aspx 页面上默认设置为 false。因此,如果它缺失,由于默认值为 true(即在机器级别),页面框架会自动调用页面事件,特别是 Page_InitPage_Load 方法。在这种情况下,不需要显式的 Handles 子句或委托。

性能问题

如果性能是关键考虑因素,我们不应将 AutoEventWireup 属性的值设置为 true。如果我们将其值设置为 true,ASP.NET 页面框架必须为每个 Web Forms(.aspx 页面)调用 CreateDelegate 方法,并且而不是依赖自动连接,而是手动覆盖页面中的事件。

致谢

整个过程其实很简单,但我只是想把它发到网上;希望它能帮助到一些人。为了将功劳归于应得者。大部分信息是从网上不同地方搜集来的。我只是将它们整理在一起,并添加了一些我自己的内容来帮助大家。我还找到了 MSDN 在线的一篇与此相关的文章(文章 ID:317690),但它是针对 VB.NET 的。

© . All rights reserved.