ASP.NET的事件模型(很適合學習的文章)

來源:互聯網
上載者:User

在Default.aspx的頁面中第一行是一條頁面指令:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="AspxEventsModel._Default" %>

其中CodeBehind屬性指定程式碼後置頁面的名稱,Inherits指定所屬的命名空間和類,AutoEventWireup屬性是可以賦值為true和false,預設是賦值為true。
我們先在Default.aspx頁面中放入兩個Literal控制項:

複製代碼 代碼如下: <asp:Literal ID="LiInit" runat="server"></asp:Literal>
<br />
<asp:Literal ID="LiLoad" runat="server"></asp:Literal>

在Default.aspx.cs頁面中,預設會存在Page_Load方法,定義如下:

複製代碼 代碼如下: protected void Page_Load(object sender, EventArgs e)
{
this.LiLoad.Text = "這是在頁面Load事件";
}

頁面被請求,在頁面載入的時候會執行該方法。

那麼這個方法為什麼會在頁面載入的時候執行,這個方法我們並沒有給它註冊給頁面相應的事件。
頁面的事件也有很多,我們列出一些重要頁面的事件看一下:
在Page類中存在下面的事件,Page類是頁面的基類:

複製代碼 代碼如下: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;

我們對這其中比較關注的事件提取出來,並根據事件的執行順序來排序:
PreInit:在頁面的初始化階段開始時引發
Init:在頁面的初始化時引發
InitComplete:在頁面的初始化結束時引發
PreLoad:在頁面的載入階段開始時引發
Load:在頁面的載入時引發
LoadComplete:在頁面的載入結束時引發
PreRender:在頁面即將被呈現時引發

我們看到頁面事件有很多,主要來研究Init和Load這兩個事件。在Default.aspx.cs頁面中,添加Page_Init方法,定義如下:

複製代碼 代碼如下: protected void Page_Init(object sender, EventArgs e)
{
this.LiInit.Text = "這是在頁面Init事件";
}

那麼還是回到上面的問題,為什麼會在頁面請求之後執行Page_Init、Page_Load方法?原因是:
ASP.NET中AutoEventWireup="true",使頁面與某些特殊的事件方法綁定,自動識別這些具有特定名稱的方法,而不需要進行註冊事件。
這些特定名稱包括:Page_Init, Page_Load等。這裡就說明:Init事件會自動與Page_Init方法綁定,Load事件自動與Page_Load方法綁定。當然這些都是AutoEventWireup="true"的功勞,當我們AutoEventWireup="false"的時候,再次請求頁面的時候,Page_Init、Page_Load方法是不會被執行的。那麼我們可以顯示註冊事件:複製代碼 代碼如下: 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:引發 System.Web.UI.Control.Init 的事件。
OnLoad:引發 System.Web.UI.Control.Load 的事件。

很好啊,我們在這邊對它們重寫,並註冊事件合情合理。
我們把對Init註冊事件語句放到OnLoad方法中,把對Load註冊事件語句放到OnInit方法中,是兩個處理的內容交換一下看看會有什麼結果:

複製代碼 代碼如下: 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);
}

我們請求頁面發現:在OnInit方法中對Load註冊事件執行了,在OnLoad方法中對Init註冊事件並沒有執行。原因是在執行OnInit方法之後,就表示Init事件已經響應完成,在之後再對Init事件註冊方法,並不會得到調用。而在OnInit方法中對Load註冊事件的時候,Load事件並沒有開始觸發,這個時候對Load註冊事件是有效。所以現在我們很多時候,都形成了一種規範,只會重寫OnInit方法,不重寫OnLoad方法,也能完成我們的需求。所以在有些架構裡面看不到OnLoad方法就是這樣形成的。我們把Default.aspx.cs頁面調整成:複製代碼 代碼如下: 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方法,我們再次調整為:複製代碼 代碼如下: protected override void OnInit(EventArgs e)
{
this.LiInit.Text = "這是在頁面Init事件";
this.LiLoad.Text = "這是在頁面Load事件";
base.OnInit(e);
}

我附上調試的源碼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 = "這是在頁面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事件";
//}
}
}

好了,趕快自己動手試試吧。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.