在Default.aspx的頁面中第一行是一條頁面指令:
%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="AspxEventsModel._Default" %>
其中CodeBehind屬性指定代碼隱藏頁面的名稱,Inherits指定所屬的命名空間和類,AutoEventWireup屬性是可以賦值為true和false,默認(rèn)是賦值為true。
我們先在Default.aspx頁面中放入兩個Literal控件:
復(fù)制代碼 代碼如下:
asp:Literal ID="LiInit" runat="server">/asp:Literal>
br />
asp:Literal ID="LiLoad" runat="server">/asp:Literal>
在Default.aspx.cs頁面中,默認(rèn)會存在Page_Load方法,定義如下:
復(fù)制代碼 代碼如下:
protected void Page_Load(object sender, EventArgs e)
{
this.LiLoad.Text = "這是在頁面Load事件";
}
頁面被請求,在頁面加載的時候會執(zhí)行該方法。
那么這個方法為什么會在頁面加載的時候執(zhí)行,這個方法我們并沒有給它注冊給頁面相應(yīng)的事件。
頁面的事件也有很多,我們列出一些重要頁面的事件看一下:
在Page類中存在下面的事件,Page類是頁面的基類:
復(fù)制代碼 代碼如下:
public event EventHandler InitComplete;
public event EventHandler LoadComplete;
public event EventHandler PreInit;
public event EventHandler PreLoad;
public event EventHandler PreRenderComplete;
public event EventHandler SaveStateComplete;
在Control類中存在下面的事件,Control類是Page類的基類:
復(fù)制代碼 代碼如下:
public event EventHandler DataBinding;
public event EventHandler Disposed;
public event EventHandler Init;
public event EventHandler Load;
public event EventHandler PreRender;
我們對這其中比較關(guān)注的事件提取出來,并根據(jù)事件的執(zhí)行順序來排序:
PreInit:在頁面的初始化階段開始時引發(fā)
Init:在頁面的初始化時引發(fā)
InitComplete:在頁面的初始化結(jié)束時引發(fā)
PreLoad:在頁面的加載階段開始時引發(fā)
Load:在頁面的加載時引發(fā)
LoadComplete:在頁面的加載結(jié)束時引發(fā)
PreRender:在頁面即將被呈現(xiàn)時引發(fā)
我們看到頁面事件有很多,主要來研究Init和Load這兩個事件。在Default.aspx.cs頁面中,添加Page_Init方法,定義如下:
復(fù)制代碼 代碼如下:
protected void Page_Init(object sender, EventArgs e)
{
this.LiInit.Text = "這是在頁面Init事件";
}
那么還是回到上面的問題,為什么會在頁面請求之后執(zhí)行Page_Init、Page_Load方法?原因是:
ASP.NET中AutoEventWireup="true",使頁面與某些特殊的事件方法綁定,自動識別這些具有特定名稱的方法,而不需要進行注冊事件。
這些特定名稱包括:Page_Init, Page_Load等。這里就說明:Init事件會自動與Page_Init方法綁定,Load事件自動與Page_Load方法綁定。當(dāng)然這些都是AutoEventWireup="true"的功勞,當(dāng)我們AutoEventWireup="false"的時候,再次請求頁面的時候,Page_Init、Page_Load方法是不會被執(zhí)行的。那么我們可以顯示注冊事件:
復(fù)制代碼 代碼如下:
protected override void OnInit(EventArgs e)
{
this.Init += new EventHandler(this.Page_Init);
base.OnInit(e);
}
protected override void OnLoad(EventArgs e)
{
this.Load += new EventHandler(this.Page_Load);
base.OnLoad(e);
}
那么OnInit和OnLoad又是什么來頭呢?
它們是Control類中定義的虛方法,所以我們可以在它的子類里面進行重寫。
看ASP.NET 的注釋是這樣描寫的:
OnInit:引發(fā) System.Web.UI.Control.Init 的事件。
OnLoad:引發(fā) System.Web.UI.Control.Load 的事件。
很好啊,我們在這邊對它們重寫,并注冊事件合情合理。
我們把對Init注冊事件語句放到OnLoad方法中,把對Load注冊事件語句放到OnInit方法中,是兩個處理的內(nèi)容交換一下看看會有什么結(jié)果:
復(fù)制代碼 代碼如下:
protected override void OnInit(EventArgs e)
{
this.Load += new EventHandler(this.Page_Load);
base.OnInit(e);
}
protected override void OnLoad(EventArgs e)
{
this.Init += new EventHandler(this.Page_Init);
base.OnLoad(e);
}
我們請求頁面發(fā)現(xiàn):在OnInit方法中對Load注冊事件執(zhí)行了,在OnLoad方法中對Init注冊事件并沒有執(zhí)行。原因是在執(zhí)行OnInit方法之后,就表示Init事件已經(jīng)響應(yīng)完成,在之后再對Init事件注冊方法,并不會得到調(diào)用。而在OnInit方法中對Load注冊事件的時候,Load事件并沒有開始觸發(fā),這個時候?qū)oad注冊事件是有效的。所以現(xiàn)在我們很多時候,都形成了一種規(guī)范,只會重寫OnInit方法,不重寫OnLoad方法,也能完成我們的需求。所以在有些框架里面看不到OnLoad方法就是這樣形成的。我們把Default.aspx.cs頁面調(diào)整成:
復(fù)制代碼 代碼如下:
protected override void OnInit(EventArgs e)
{
this.Init += new EventHandler(this.Page_Init);
this.Load += new EventHandler(this.Page_Load);
base.OnInit(e);
}
很明顯我們覺得不需要Page_Init和Page_Load方法,我們再次調(diào)整為:
復(fù)制代碼 代碼如下:
protected override void OnInit(EventArgs e)
{
this.LiInit.Text = "這是在頁面Init事件";
this.LiLoad.Text = "這是在頁面Load事件";
base.OnInit(e);
}
我附上調(diào)試的源碼Default.aspx:
復(fù)制代碼 代碼如下:
%@ Page Language="C#" AutoEventWireup="false" CodeBehind="Default.aspx.cs" Inherits="AspxEventsModel._Default" %>
!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
html xmlns="http://www.w3.org/1999/xhtml">
head runat="server">
title>/title>
/head>
body>
asp:Literal ID="LiInit" runat="server">/asp:Literal>
br />
asp:Literal ID="LiLoad" runat="server">/asp:Literal>
/body>
/html>
Default.aspx.cs:
復(fù)制代碼 代碼如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace AspxEventsModel
{
public partial class _Default : System.Web.UI.Page
{
protected override void OnInit(EventArgs e)
{
this.LiInit.Text = "這是在頁面Init事件";
this.LiLoad.Text = "這是在頁面Load事件";
//this.Init += new EventHandler(this.Page_Init);
//this.Load += new EventHandler(this.Page_Load);
base.OnInit(e);
}
//protected override void OnLoad(EventArgs e)
//{
// this.Load += new EventHandler(this.Page_Load);
// //this.Init += new EventHandler(this.Page_Init);
// base.OnLoad(e);
//}
//protected void Page_Init(object sender, EventArgs e)
//{
// this.LiInit.Text = "這是在頁面Init事件";
//}
//protected void Page_Load(object sender, EventArgs e)
//{
// this.LiLoad.Text = "這是在頁面Load事件";
//}
}
}
好了,趕快自己動手試試吧。
您可能感興趣的文章:- js DOM模型操作
- js事件模型與自定義事件實例解析
- javascript事件捕獲機制【深入分析IE和DOM中的事件模型】
- javascript事件模型介紹
- javascript事件模型實例分析
- Javascript基礎(chǔ)知識(一)核心基礎(chǔ)語法與事件模型
- 事件模型在各瀏覽器中存在差異
- 關(guān)于javascript DOM事件模型的兩件事
- 帶你快速理解javascript中的事件模型