ASP.NET的事件模型(很适合学习的文章)

在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事件";
        //}
    }
}

好了,赶快自己动手试试吧。

(0)

相关推荐

  • 关于javascript DOM事件模型的两件事

    事件捕捉(Event Capture)的实现问题 W3C DOM Level2的事件模型规范中,事件在DOM树中的传播过程(从根节点到目标节点)被分为了两个阶段:捕捉(Capture)和冒泡(Bubbling).下面这个图能大概的说明整个过程: (from W3C) 如果想创建一个捕捉事件,在支持W3C 事件模型的浏览器中,将addEventListener的第三个参数设为true就好了.例如: 复制代码 代码如下: document.getElementById('foo').addEvent

  • js DOM模型操作

    DOM模型中的节点:元素节点.文本节点.属性节点 例:<a href="http://www.cnblogs.com/shuz">私のdotnet小屋</a> (1)a是元素节点 (2)"私のdotnet小屋"是文本节点 (3)href="http://www.cnblogs.com/shuz"是属性节点 DOM节点的属性 属性 类型 说明 nodeName String 节点名称,根据节点的类型而定义 nodeValue

  • javascript事件模型实例分析

    本文实例讲述了javascript事件模型的用法.分享给大家供大家参考.具体分析如下: 一.事件模型 冒泡型事件(Bubbling):事件由叶子节点沿祖先节点一直向上传递到根节点 捕获型事件(Capturing):由DOM树最顶元素一直到最精确的元素,与冒泡型事件相反 DOM标准事件模型:DOM标准既支持冒泡型事件,也支持捕获型事件,可以说是两者的结合体,首先是捕获型,接着冒泡传递 二.事件对象 在IE浏览器中事件对象是window的一个属性,在DOM标准中,event必须作为唯一的参数传给事件

  • Javascript基础知识(一)核心基础语法与事件模型

    一.Javascript核心基础语法 1.Javascript是一门增加交互效果的编程语言,它最初由网景公司发明,最后提交给ECMA(欧洲计算机制造商协会),ECMA将Javascript标准化,其命名为Javascript. 2.Javascript是一门解释性语言,无需编译就可以直接在浏览器下运行. 3.Javascript的用途? 1.可以控制网页中所有元素,增加.删除.修改元素的属性. 2.可以在html中放入动态文本. 3.响应用户在使用网页时产生的事件. 4.校验用户输入的数据. 5

  • 带你快速理解javascript中的事件模型

    javascript中有两种事件模型:DOM0,DOM2.而对于这两种的时间模型,我一直不是非常的清楚,现在通过网上查阅资料终于明白了一些. 一.  DOM0级事件模型 DOM0级事件模型是早期的事件模型,所有的浏览器都是支持的,而且其实现也是比较简单.代码如下: <p id = 'click'>click me</p> <script> document.getElementById('click').onclick = function(event){ alert(

  • javascript事件模型介绍

    一.原始事件模型 其事件类型:分为"输入事件(如onclicki)"和"语义事件(如onsubmit)" 事件程序的注册可以以下几种方式: 1.JS代码作为HTML性质值 复制代码 代码如下: <input type="button" value="Press me" onclick="alert('thanks');" 2.事件处理程序作为JS属性 附注:文档中的每个HTML元素在文档树中都有一个相

  • 事件模型在各浏览器中存在差异

    标准参考 根据 W3C DOM 2 Events 描述,EventTarget 接口被所有支持 DOM 事件模型的节点(Node)实现. 该接口提供了 'addEventListener' 和 'removeEventListener' 方法,用来绑定或解绑一个 EventListeners 接口到一个 EventTarget. DOM 2 Events 中定义了 Event 接口,用来提供事件的上下文信息,它提供了若干标准属性和方法. 实现 Event 接口的对象一般作为第一个参数传入事件处理

  • js事件模型与自定义事件实例解析

    JavaScript 一个最简单的事件模型,需要有事件绑定与触发,还有事件删除. var eventModel = { list: {}, bind: function () { var args = [].slice.call(arguments), type = args[0], handlers = args.slice(1); if (typeof type === 'string' && handlers.length > 0) { for (var i = 0; i &l

  • javascript事件捕获机制【深入分析IE和DOM中的事件模型】

    本文实例分析了javascript事件捕获机制.分享给大家供大家参考,具体如下: 1.什么是事件冒泡? 在排序算法中,我们学过冒泡排序法,所谓冒泡就是让底层的东西浮出水面,对于事件冒泡也同样是如此, 下面我们来看一个例子来说明什么是事件冒泡. <div> <button>测试</button> </div> <script> $("div").bind("click",function(){alert(&q

  • ASP.NET的事件模型(很适合学习的文章)

    在Default.aspx的页面中第一行是一条页面指令: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="AspxEventsModel._Default" %> 其中CodeBehind属性指定代码隐藏页面的名称,Inherits指定所属的命名空间和类,AutoEventWireup属性是可以

  • 遭遇ASP类的事件设计

    作者的blog: http://blog.csdn.net/oyiboy/ 我之所以还是要宣扬用MVC来开发ASP,只是想让面向过程的思考方式变成面向对象的思考方式,这个对于任何一种语言的开发员来说都是有好处的. MVC是个标准模型,ASP要实现似乎真的是很困难,但是标准是标准,运用是运用,既然ASP要实现这个模型很难,那可以尝试着将MVC模型变形成适合自己的模型. "不管白猫黑猫能逮到耗子的就是好猫."而对于我们开发者来说,不管是什么模型,能正确的指引我们的思路,完美完成项目的模型就

  • jQuery学习5 jQuery事件模型

    jQuery事件模型的功能有: 提供建立事件处理程序的统一方法: 允许在每个元素上为每个时间类型建立多个处理程序: 采用标准的事件类型名称,例如click或mouseover: 使用Event实例可用作处理程序的参数: 对Event实例的最常用的属性进行规范化: 为取消事件和阻塞默认操作提供统一方法. jQuery绑定事件处理程序: bind()命令 $('img').bind('click',funciton(event){alert('Hi there');}); 该语句为页面上的图片绑定已

  • jQuery学习4 浏览器的事件模型

    首先要知道DOM的两级模式:DOM0级和DOM2级 在DOM0级事件处理程序是通过把函数实例的引用指派到DOM元素的属性而声明的. 声明DOM第0级事件处理程序 复制代码 代码如下: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <title>DOM Lev

  • ASP.NET MVC数组模型绑定详解

    在ASP.NET MVC中使用Razor语法可以在视图中方便地展示数组,如果要进行数组模型绑定,会遇到索引断裂问题,如下示例: <input type="text" name="[0].Name" /> <input type="text" name="[1].Name" /> <input type="text" name="[2].Name" />

  • ASP.NET中事件如何依次发生?

    本文通过实战的方法简单介绍ASP.NET中的事件执行顺序. 方法/步骤 新建C# WebForm项目,如下图: 在Defualt.aspx文件中添加一个Button控件并命名为Button1,然后为该控件各个事件添加事件处理程序,并添加断点,如下图: 打开Global.asax文件并添加断点,如下图: 打开Site.Master的代码文件Site.Master.cs,并添加断点,如下图: 按F5调试运行,查看代码运行顺序:Application_Start→Session_Start→Butto

  • javascript事件模型代码

    本节稍稍深入地讨论关于事件处理的话题,如果你对模式.闭包和面向对象等概念还不太理解,不妨暂且等阅读完相关内容之后再回过头来阅读它,相信你会有很大收获. 1 事件处理模式 在程序设计领域,"事件处理"是一种模式,当一个对象受外部影响而改变状态时,通过消息的方式将这个状态改变通知给这个对象或者相关联的某个对象,让它执行对应的动作,这就是事件处理的基本原理.负责通知状态改变的对象被称作"消息",而执行响应动作的属性则被称作"事件代理".        

随机推荐