ASP.NET的事件模型(很適合學(xué)習(xí)的文章)
在Default.aspx的頁(yè)面中第一行是一條頁(yè)面指令:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="AspxEventsModel._Default" %>
其中CodeBehind屬性指定代碼隱藏頁(yè)面的名稱,Inherits指定所屬的命名空間和類,AutoEventWireup屬性是可以賦值為true和false,默認(rèn)是賦值為true。
我們先在Default.aspx頁(yè)面中放入兩個(gè)Literal控件:
<asp:Literal ID="LiInit" runat="server"></asp:Literal>
<br />
<asp:Literal ID="LiLoad" runat="server"></asp:Literal>
在Default.aspx.cs頁(yè)面中,默認(rèn)會(huì)存在Page_Load方法,定義如下:
protected void Page_Load(object sender, EventArgs e)
{
this.LiLoad.Text = "這是在頁(yè)面Load事件";
}
頁(yè)面被請(qǐng)求,在頁(yè)面加載的時(shí)候會(huì)執(zhí)行該方法。
那么這個(gè)方法為什么會(huì)在頁(yè)面加載的時(shí)候執(zhí)行,這個(gè)方法我們并沒(méi)有給它注冊(cè)給頁(yè)面相應(yīng)的事件。
頁(yè)面的事件也有很多,我們列出一些重要頁(yè)面的事件看一下:
在Page類中存在下面的事件,Page類是頁(yè)面的基類:
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類的基類:
public event EventHandler DataBinding;
public event EventHandler Disposed;
public event EventHandler Init;
public event EventHandler Load;
public event EventHandler PreRender;
我們對(duì)這其中比較關(guān)注的事件提取出來(lái),并根據(jù)事件的執(zhí)行順序來(lái)排序:
PreInit:在頁(yè)面的初始化階段開始時(shí)引發(fā)
Init:在頁(yè)面的初始化時(shí)引發(fā)
InitComplete:在頁(yè)面的初始化結(jié)束時(shí)引發(fā)
PreLoad:在頁(yè)面的加載階段開始時(shí)引發(fā)
Load:在頁(yè)面的加載時(shí)引發(fā)
LoadComplete:在頁(yè)面的加載結(jié)束時(shí)引發(fā)
PreRender:在頁(yè)面即將被呈現(xiàn)時(shí)引發(fā)
我們看到頁(yè)面事件有很多,主要來(lái)研究Init和Load這兩個(gè)事件。在Default.aspx.cs頁(yè)面中,添加Page_Init方法,定義如下:
protected void Page_Init(object sender, EventArgs e)
{
this.LiInit.Text = "這是在頁(yè)面Init事件";
}
那么還是回到上面的問(wèn)題,為什么會(huì)在頁(yè)面請(qǐng)求之后執(zhí)行Page_Init、Page_Load方法?原因是:
ASP.NET中AutoEventWireup="true",使頁(yè)面與某些特殊的事件方法綁定,自動(dòng)識(shí)別這些具有特定名稱的方法,而不需要進(jìn)行注冊(cè)事件。
這些特定名稱包括:Page_Init, Page_Load等。這里就說(shuō)明:Init事件會(huì)自動(dòng)與Page_Init方法綁定,Load事件自動(dòng)與Page_Load方法綁定。當(dāng)然這些都是AutoEventWireup="true"的功勞,當(dāng)我們AutoEventWireup="false"的時(shí)候,再次請(qǐng)求頁(yè)面的時(shí)候,Page_Init、Page_Load方法是不會(huì)被執(zhí)行的。那么我們可以顯示注冊(cè)事件:
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又是什么來(lái)頭呢?
它們是Control類中定義的虛方法,所以我們可以在它的子類里面進(jìn)行重寫。
看ASP.NET 的注釋是這樣描寫的:
OnInit:引發(fā) System.Web.UI.Control.Init 的事件。
OnLoad:引發(fā) System.Web.UI.Control.Load 的事件。
很好啊,我們?cè)谶@邊對(duì)它們重寫,并注冊(cè)事件合情合理。
我們把對(duì)Init注冊(cè)事件語(yǔ)句放到OnLoad方法中,把對(duì)Load注冊(cè)事件語(yǔ)句放到OnInit方法中,是兩個(gè)處理的內(nèi)容交換一下看看會(huì)有什么結(jié)果:
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);
}
我們請(qǐng)求頁(yè)面發(fā)現(xiàn):在OnInit方法中對(duì)Load注冊(cè)事件執(zhí)行了,在OnLoad方法中對(duì)Init注冊(cè)事件并沒(méi)有執(zhí)行。原因是在執(zhí)行OnInit方法之后,就表示Init事件已經(jīng)響應(yīng)完成,在之后再對(duì)Init事件注冊(cè)方法,并不會(huì)得到調(diào)用。而在OnInit方法中對(duì)Load注冊(cè)事件的時(shí)候,Load事件并沒(méi)有開始觸發(fā),這個(gè)時(shí)候?qū)oad注冊(cè)事件是有效的。所以現(xiàn)在我們很多時(shí)候,都形成了一種規(guī)范,只會(huì)重寫OnInit方法,不重寫OnLoad方法,也能完成我們的需求。所以在有些框架里面看不到OnLoad方法就是這樣形成的。我們把Default.aspx.cs頁(yè)面調(diào)整成:
protected override void OnInit(EventArgs e)
{
this.Init += new EventHandler(this.Page_Init);
this.Load += new EventHandler(this.Page_Load);
base.OnInit(e);
}
很明顯我們覺(jué)得不需要Page_Init和Page_Load方法,我們?cè)俅握{(diào)整為:
protected override void OnInit(EventArgs e)
{
this.LiInit.Text = "這是在頁(yè)面Init事件";
this.LiLoad.Text = "這是在頁(yè)面Load事件";
base.OnInit(e);
}
我附上調(diào)試的源碼Default.aspx:
<%@ 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:
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 = "這是在頁(yè)面Init事件";
this.LiLoad.Text = "這是在頁(yè)面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 = "這是在頁(yè)面Init事件";
//}
//protected void Page_Load(object sender, EventArgs e)
//{
// this.LiLoad.Text = "這是在頁(yè)面Load事件";
//}
}
}
好了,趕快自己動(dòng)手試試吧。
相關(guān)文章
Asp.Mvc 2.0實(shí)現(xiàn)用戶登錄與注銷功能實(shí)例講解(2)
這篇文章主要介紹了Asp.Mvc 2.0實(shí)現(xiàn)用戶登錄與注銷功能,用戶登錄方式都是FORM表單驗(yàn)證方式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2015-08-08
ajaxToolkit:AccordionPane演示與應(yīng)用實(shí)例
ajaxToolkit:AccordionPane演示與應(yīng)用實(shí)例,需要的朋友可以參考一下2013-04-04
asp.net使用WebAPI和EF框架結(jié)合實(shí)現(xiàn)數(shù)據(jù)的基本操作
這篇文章介紹了asp.net使用WebAPI和EF框架結(jié)合實(shí)現(xiàn)數(shù)據(jù)基本操作的案例,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04
MVC+EasyUI+三層新聞網(wǎng)站建立 tabs標(biāo)簽制作方法(六)
這篇文章主要為大家詳細(xì)介紹了MVC+EasyUI+三層新聞網(wǎng)站建立的第六篇,教大家如何制作tabs標(biāo)簽,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07
.net core中的Authorization過(guò)濾器使用
這篇文章主要介紹了.net core中的Authorization過(guò)濾器使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
狀態(tài)保存機(jī)制之ViewState概述及應(yīng)用
無(wú)狀態(tài)的根本原因是:瀏覽器和服務(wù)器使用Socket通信,服務(wù)器將請(qǐng)求結(jié)果返回給瀏覽器后,會(huì)關(guān)閉當(dāng)前Socket連接,接下來(lái)介紹狀態(tài)保存機(jī)制,感興趣的朋友可以了解下2013-02-02
Asp.net Socket客戶端(遠(yuǎn)程發(fā)送和接收數(shù)據(jù))
通過(guò)Socket遠(yuǎn)程發(fā)送與接收數(shù)據(jù)的代碼類2008-11-11

