濮阳杆衣贸易有限公司

主頁(yè) > 知識(shí)庫(kù) > ASP.NET的事件模型(很適合學(xué)習(xí)的文章)

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

熱門(mén)標(biāo)簽:保山電話外呼管理系統(tǒng)怎么用 電話機(jī)器人廣告話術(shù) 外呼系統(tǒng)用員工身份證 淘寶地圖標(biāo)注如何做 使用智能電話機(jī)器人違法嗎 朝陽(yáng)市地圖標(biāo)注 太原外呼電銷(xiāo)機(jī)器人費(fèi)用 東莞語(yǔ)音電銷(xiāo)機(jī)器人排名 蘇州銷(xiāo)售外呼系統(tǒng)預(yù)算

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

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

其中CodeBehind屬性指定代碼隱藏頁(yè)面的名稱(chēng),Inherits指定所屬的命名空間和類(lèi),AutoEventWireup屬性是可以賦值為true和false,默認(rèn)是賦值為true。
我們先在Default.aspx頁(yè)面中放入兩個(gè)Literal控件:

復(fù)制代碼 代碼如下:

        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方法,定義如下:

復(fù)制代碼 代碼如下:

        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類(lèi)中存在下面的事件,Page類(lèi)是頁(yè)面的基類(lèi):

復(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類(lèi)中存在下面的事件,Control類(lèi)是Page類(lèi)的基類(lèi):
復(fù)制代碼 代碼如下:

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è)面的初始化階段開(kāi)始時(shí)引發(fā)
Init:在頁(yè)面的初始化時(shí)引發(fā)
InitComplete:在頁(yè)面的初始化結(jié)束時(shí)引發(fā)
PreLoad:在頁(yè)面的加載階段開(kāi)始時(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方法,定義如下:

復(fù)制代碼 代碼如下:

        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í)別這些具有特定名稱(chēng)的方法,而不需要進(jìn)行注冊(cè)事件。
這些特定名稱(chēng)包括: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è)事件:
復(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又是什么來(lái)頭呢?
它們是Control類(lèi)中定義的虛方法,所以我們可以在它的子類(lèi)里面進(jìn)行重寫(xiě)。
看ASP.NET 的注釋是這樣描寫(xiě)的:
OnInit:引發(fā) System.Web.UI.Control.Init 的事件。
OnLoad:引發(fā) System.Web.UI.Control.Load 的事件。

很好啊,我們?cè)谶@邊對(duì)它們重寫(xiě),并注冊(cè)事件合情合理。
我們把對(duì)Init注冊(cè)事件語(yǔ)句放到OnLoad方法中,把對(duì)Load注冊(cè)事件語(yǔ)句放到OnInit方法中,是兩個(gè)處理的內(nèi)容交換一下看看會(huì)有什么結(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);
        }

我們請(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)有開(kāi)始觸發(fā),這個(gè)時(shí)候?qū)oad注冊(cè)事件是有效的。所以現(xiàn)在我們很多時(shí)候,都形成了一種規(guī)范,只會(huì)重寫(xiě)OnInit方法,不重寫(xiě)OnLoad方法,也能完成我們的需求。所以在有些框架里面看不到OnLoad方法就是這樣形成的。我們把Default.aspx.cs頁(yè)面調(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);
        }

很明顯我們覺(jué)得不需要Page_Init和Page_Load方法,我們?cè)俅握{(diào)整為:
復(fù)制代碼 代碼如下:

        protected override void OnInit(EventArgs e)
        {
            this.LiInit.Text = "這是在頁(yè)面Init事件";
            this.LiLoad.Text = "這是在頁(yè)面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 = "這是在頁(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)手試試吧。

您可能感興趣的文章:
  • js DOM模型操作
  • js事件模型與自定義事件實(shí)例解析
  • javascript事件捕獲機(jī)制【深入分析IE和DOM中的事件模型】
  • javascript事件模型介紹
  • javascript事件模型實(shí)例分析
  • Javascript基礎(chǔ)知識(shí)(一)核心基礎(chǔ)語(yǔ)法與事件模型
  • 事件模型在各瀏覽器中存在差異
  • 關(guān)于javascript DOM事件模型的兩件事
  • 帶你快速理解javascript中的事件模型

標(biāo)簽:運(yùn)城 洛陽(yáng) 綏化 潛江 西藏 呼倫貝爾 克拉瑪依 阿里

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《ASP.NET的事件模型(很適合學(xué)習(xí)的文章)》,本文關(guān)鍵詞  ASP.NET,的,事件,模型,很,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《ASP.NET的事件模型(很適合學(xué)習(xí)的文章)》相關(guān)的同類(lèi)信息!
  • 本頁(yè)收集關(guān)于ASP.NET的事件模型(很適合學(xué)習(xí)的文章)的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    临汾市| 开鲁县| 德清县| 水城县| 鲁甸县| 凉城县| 西乌珠穆沁旗| 德化县| 平乡县| 从化市| 大港区| 莫力| 奉化市| 和田市| 岱山县| 宁津县| 雷州市| 禄劝| 临猗县| 太谷县| 沙坪坝区| 克东县| 洪泽县| 奉贤区| 伊金霍洛旗| 平原县| 文水县| 丰台区| 石嘴山市| 宣武区| 隆昌县| 湖口县| 西吉县| 新泰市| 尚义县| 茶陵县| 黄陵县| 高台县| 方山县| 峨边| 印江|