AutoEventWireup
attribute in Microsoft ASP.NET Web Forms
ASP.NET supports two
methods to author pages:
In-line code is code that is embedded directly within the
ASP.NET page. Code-behind refers to code for your ASP.NET page that is
contained within a separate class file. This allows a clean separation of your
HTML from your presentation logic.
When we use Microsoft
Visual Studio .NET to create ASP.NET Web Forms, code-behind pages are the
default method. In addition, Visual Studio .NET automatically performs precompilation
for us when we build our solution.
A little bit of background
Directives in ASP.NET control the settings and properties of page and
user control compilers. They can be included anywhere on a page, although it is
standard to place them at the beginning. Directives are used in both .aspx
files (ASP.NET pages) and .ascx files (user control pages). ASP.NET
pages actually support eight different directives.
Page directives are the most commonly used directives, and are
used to edit a wide variety of settings that control how the page parser and
page compiler work. The following is a list of some of the more commonly used
page directive attributes in ASP.NET.
Collapse
Copy
Code
@ Page
language="c#" Codebehind="WebForm1.aspx.cs"
AutoEventWireup="false"
Inherits="TestWebApp.WebForm1"
Note: In the above case,
ASP.NET compiles the code-behind page on the fly. We have to note that this
compilation step only occurs when the code-behind file is updated. Whether the
file has been updated or not, well this is detected through a timestamp change.
To get to the Real Thing
The AutoEventWireup
attribute may have a value of true or false. When an ASP.NET Web
Application is created by using Microsoft Visual Studio .NET, the value of the AutoEventWireup
attribute is set as false.
We can specify the
default value of the AutoEventWireup attribute in the following locations:
The value of the AutoEventWireup
attribute can be declared in the <pages> section in the Machine.config file or the Web.config
file, as follows:
Collapse
Copy
Code
<configuration> <system.web> <pages autoEventWireup="true|false"
/> </system.web> </configuration>
If you make these
changes in the Machine.config file, the changes affect all ASP.NET
Web Forms on the computer. If you make these changes in the Web.config
file, the changes affect only the application that the file belongs to.
However, to make changes in the individual Web Form Only, we have to add
the AutoEventWireup
attribute to the @ Page directive, as shown above.
Check out the Code
When we create a new
ASP.NET Web Application in Visual Studio .NET, as mentioned earlier, by
default, the value of the AutoEventWireup attribute is set to false in the .aspx page and event handlers are automatically
created. We can find this in the InitializeComponent method:
Collapse
Copy
Code
this.Load += new System.EventHandler(this.Page_Load);
The best way to see the
working of this attribute would be:
Collapse
Copy
Code
<%
Response.Write(msg); %>
In
the Page_Load, you could enter a
value for the variable msg declared.
Collapse
Copy
Code
msg=
"We
are in Page_Load()";
On running the
application, you will get the message We are in Page_Load() [hereafter
referred to as message]. Note: this is in the default case where the attribute
is set to false.
Now try commenting the
event handler code for the Page_Load in the aspx.cs file; and set the AutoEventWireup
attribute to false in the .aspx page. On running the
application this time, you will not get the message.
Now with the event
handler code for the Page_Load in the aspx.cs file still commented; set the AutoEventWireup
attribute to true in the .aspx page. On running the application
this time, you will get the message.
Reason: In the case where AutoEventWireup
attribute is set to false (by default), event handlers are automatically
required for Page_Load or Page_Init. However, when we set the value of the AutoEventWireup
attribute to true, the ASP.NET runtime does not require events to
specify event handlers like Page_Load or Page_Init.
A thing to be kept in
mind is that the AutoEventWireup attribute of the Page directive is set to true by default for the machine (check out the value of this attribute in the machine.config)
but set to false by default for a .aspx page). So if it is missing, since by default it is true (i.e., at the machine level), the page framework calls page
events automatically, specifically the Page_Init and Page_Load methods. In that case, no explicit Handles clause or delegate is needed.
Performance Issues
We must not set the
value of the AutoEventWireup attribute to true if performance is a key consideration. If we
set the value of the AutoEventWireup attribute to true, the ASP.NET page framework must make a call to
the CreateDelegate
method for every Web Form (.aspx page), and instead of relying on the
automatic hookup, manually override the events from the page.