ASP.NET的事件模型

转载 2012年03月28日 09:36:16

当我们新建一个ASP.NET的应用程序时,会默认生成一个Default.aspx和Default.aspx.cs页面。
在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:

View Code
<%@ 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:

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


http://blog.chinaunix.net/uid-26727976-id-3142736.html

ASP.NET基础与入门:WebForm,事件驱动编程,Page类

注:因为这个暑假做了一个ASP.NET的项目(WebForms模式),暑假期间太忙没有来得及整理,现在统一梳理下知识(有些我认为可以跟HTML共通的就没记)推荐几个学习ASP.NET的网站:W3Sch...
  • Jurbo
  • Jurbo
  • 2016年08月29日 15:10
  • 4522

asp.net webform事件触发顺序

了解页的生存周期中的每一个请求是非常重要的,丢值、丢状态的问题都可能是你对页的生存周期了解不够造成的。   当然,如果你要在asp.net保留状态的话,可以用诸如Application,Sessio...
  • tousen925
  • tousen925
  • 2014年05月06日 16:46
  • 547

Asp.net 用户控件添加自定义事件asp.net

Asp.net 用户控件添加自定义事件asp.net
  • Sunqlive
  • Sunqlive
  • 2016年09月07日 11:17
  • 869

ASP.NET的事件模型

当我们新建一个ASP.NET的应用程序时,会默认生成一个Default.aspx和Default.aspx.cs页面。 在Default.aspx的页面中第一行是一条页面指令: t" %> 其中C...
  • yuanyuanispeak
  • yuanyuanispeak
  • 2013年07月04日 09:39
  • 519

ASP.NET的事件模型

当我们新建一个ASP.NET的应用程序时,会默认生成一个Default.aspx和Default.aspx.cs页面。 在Default.aspx的页面中第一行是一条页面指令: t" %> ...
  • my98800
  • my98800
  • 2016年05月06日 10:32
  • 111

ASP.NET的事件模型

 当我们新建一个ASP.NET的应用程序时,会默认生成一个Default.aspx和Default.aspx.cs页面。 在Default.aspx的页面中第一行是一条页面指令: t" %>...
  • u011374560
  • u011374560
  • 2014年05月26日 10:46
  • 405

asp.net中为Calendar日历控件添加双击日期事件

最近一直在做日历控件,希望能直接在上面双击具体某一天就能弹窗添加事件,刚开始是想在网上找找人家做好的日历控件来用的,后面发现由于公司加密软件的原因,那些插件基本上都用不了,最后没法子了,只好自己来慢慢...
  • yangmingxing980
  • yangmingxing980
  • 2014年02月28日 15:16
  • 1529

asp.net服务器控件的事件是怎样触发的

 1. 事件基本概念   事件是当有动作发生或者状态改变时,类发出的信息或者通知。通常情况下,状态的发生或者改变由用户界面动作初始化,例如,单击按钮,或者由于其他的程序逻辑引起。产生事件的...
  • u011374560
  • u011374560
  • 2014年05月26日 10:31
  • 1082

理解ASP.NET MVC中的模型绑定

模型绑定的本质     任何控制器方法的执行都受action invoker组件(下文用invoker代替)控制。对于每个Action方法的参数,这个invoker组件都会获取一个Model Bin...
  • dyllove98
  • dyllove98
  • 2013年06月15日 14:33
  • 5039

ASP.NET-008—JS绑定控件事件

界面上的事件一般可以通过控件自带的事件属性添加事件。其实还有一个方式,就是让JS来给控件绑定事件,这样一来就可以实现控件的事件动态进行变化,在实现功能的时候会更加方便。JS绑定控件事件的格式如下: $...
  • yysyangyangyangshan
  • yysyangyangyangshan
  • 2014年03月31日 22:32
  • 3924
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ASP.NET的事件模型
举报原因:
原因补充:

(最多只允许输入30个字)