导致Page_Load被执行两次的原因 AutoEventWireup属性与Page_Load事件

时间:2022-01-16 18:53:32

asp.net(AutoEventWireup属性的确切含义)
使用Asp.NET时,新建的aspx页面第一行page指令中包含了一个 AutoEventWireup属性。网上的很多教程认为这一属性,甚至这一行代码都是没用的。其实,这是不了解Asp.NET事件处理模型的表现。简单来说,这一属性决定了当前页是否自动关联某些特殊事件。
     首先,从浏览器页面触发的事件不能立刻在本地得到处理,而是POST至服务器上,因此,Asp.NET建立了委托(代理)机制。在建立一个事件的同时,建立相应的委托:
private void InitializeComponent()
   {   
    this.mybutton.Click += new System.EventHandler(this.Button1_Click);//委托
   }
private void Button1_Click(object sender, System.EventArgs e)
   {
    //事件内容
   }
     委托将事件与该页面显式关联。在AutoEventWireup="false"时,如果没有委托,事件将不执行。
     这与早期VB采用的隐式事件挂起截然不同,各有利弊。但,Asp.NET中可以修改AutoEventWireup="true",使页面与某些特殊的事件方法绑定,自动识别这些具有特定名称的事件,而不需要进行委托。这些特定名称包括:Page_Init, Page_Load, Page_DataBind, Page_PreRender和Page_Unload等。比如:
private void Page_Load(object sender, System.EventArgs e)
   {
    // 事件内容
   }
     针对这些事件方法,开发人员可以利用该参数避免编写过多的链接代码。如果该属性设置为"false",则代码应改为:
private void InitializeComponent()
   {   
    this.mybutton.Click += new System.EventHandler(this.Button1_Click);//委托
    this.Load += new System.EventHandler(this.Page_Load);//可以用AutoEventWireup属性避免的委托
   }
private void Page_Load(object sender, System.EventArgs e)
   {
    // 事件内容
   }
private void Button1_Click(object sender, System.EventArgs e)
   {
    //事件内容
   }
     一定不可以在没有委托的情况下使用Page_Load类似的方法!
     大部分情况下,页面不需要关联如此多的特殊事件,会增加额外的操作和系统开销。同时, ASP.NET 页框架自动调用事件处理的方法基于其预定名称,这会导致到相同事件处理方法当页运行被调用两次,也会增大系统开销。因此,Microsoft 建议始终将 AutoEventWireup 设置为 FALSE。

 

 

 

 

 

有时你会发现页面载入需要较长时间,调试时发现是Page_Load被执行两次。

其实原因就在于你在ASPX页面里去掉了AutoEventWireup或是将其属性置为True:

AutoEventWireup="false"设置。

<%@ Page language="c#" Codebehind="ShowSimpleFactory.aspx.cs" AutoEventWireup="false" Inherits="test.DesignPatternTest.ShowSimpleFactory" %>

那么什么是AutoEventWireup呢?

如果      Page      指令的      AutoEventWireup      属性被设置为      true(或者如果缺少此属性,因为它默认为      true),该页框架将自动调用页事件,即      Page_Init      和      Page_Load   方法。在这种情况下,不需要任何显式的      Handles      子句或委托。   

在     Web     服务器控件中,某些事件(通常是     Click     事件)会导致窗体被回发到服务器。HTML     服务器控件和     Web     服务器控件(如     TextBox     控件)中的更改事件将被捕获,但不会立即导致发送。相反,它们会被该控件缓存,直到发送再次发生时为止。然后,当再次在服务器上处理该页时,将引发并处理所有的挂起事件。  
    支持更改事件的     Web     服务器控件包含     AutoPostBack     属性。当此属性为     true     时,控件的更改事件会导致立即发送窗体,而不等待     Click     事件。例如,默认情况下,CheckBox     控件的     CheckedChange     事件不会导致该页被提交。但是,通过将该控件的     AutoPostBack     属性设置为     true,可以指定当用户单击复选框时,立即将该页发送到服务器进行处理。

PS:另外还有一种说法就是在页面Default页面里有<img src="">也出现Page_Load被执行两次的问题!