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

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

时间: 2024-09-20 08:46:08

ASP.NET的事件模型(很适合学习的文章)_实用技巧的相关文章

asp.net Application_AcquireRequestState事件,导致Ajax客户端不能加载_实用技巧

开发环境IIS7下一切正常,但是部署到IIS6服务器以后, 每次刷新页面总出现Ajax客户端不能加载的问题. 复制代码 代码如下: protected void Application_AcquireRequestState(object sender, EventArgs e) { string oldToken = Session["token"].ToString(); } MSDN上说: Application_AcquireRequestState, 当ASP.NET获取当前

asp.net开发中怎样去突破文件依赖缓存_实用技巧

在Web项目中可以使用Session,Application等来缓存数据,也可以使用Cache来缓存. 今天我们特别关注的是Cache缓存.Cache位于命名空间System.Web.Caching命名空间下,看到这里我们想到的是它在Web项目中使用. 说明:Cache 类不能在 ASP.NET 应用程序外使用.它是为在 ASP.NET 中用于为 Web 应用程序提供缓存而设计和测试的.在其他类型的应用程序(如控制台应用程序或 Windows 窗体应用程序)中,ASP.NET 缓存可能无法正常工

ASP.NET网站导航及导航控件如何使用_实用技巧

网站导航? 传统的网站导航需要我们在是在页面上弄超链接的方式来实现的,在页面修改或移动的的时候需要一一在每个页中都要进行修改,这样会很麻烦. 在网站中建立网站地图,也就是把所有的链接地址放在一个专门的文件中进行统一管理,这样就很方面的进行管理. 怎么弄网站导航?怎么做? 需要在VS中新建网站地图文件,再把网站地图文件与我们想要的导航控件相关联,这样就可以实现导航的效果了,我们要更改某个地址,就直接在站点地图.siteMap文件中更改就行了. vs中如何添加网站地图? 在vs中新建项中选择"站点地

asp.net使用DataGridTree实现下拉树的方法_实用技巧

本文实例讲述了asp.net使用DataGridTree实现下拉树的方法.分享给大家供大家参考.具体实现方法如下: 下拉树实现原理:输出json到客户端,客户端实现动态加载,中间不会和服务端交互.数据量支持上经测试几千还是很快的.本下拉树控件是用c#+js树实现. 2.c# 计算器 计算字符串数学表达式源码 计算数学表达式原理 采用c#实现 很实用 //a.建立两个栈:第一个位操作数栈,第二个操作符符栈!(将栈定义为string类型) //b.对数字来说是无条件压入数字栈中. //c.而对符号来

asp.net+Ajax校验用户是否存在的实现代码_实用技巧

需求:做一个ajax登录 主要技术点:jquery ajax以及blur事件 当用户名输入框失去焦点的时候就会触发blur事件,然后进行ajax请求,获得结果(true或者false),如果请求结果为true,就把用户名输入框图片替换成ok,并且输出文字:恭喜您, 这个帐号可以注册,否则就替换成图片no,并且输出文字:账号已存在 源代码: 前台: 复制代码 代码如下: <%@ Page Language="C#" MasterPageFile="~/Top_Down.m

一天精通asp.net的学习经验小结_实用技巧

1.Validator 2.IsPostBack 3.AutoPostBack.控件离开焦点的时候自动Post. 4.repeater控件的使用.:Repeater控件比以前版本的asp.net好用了,只要 Eval就可以了,不用DataBinder.Eval(container.DataItem,"***"):了,只要Eval("Name")就可以,注意不能丢了前面的"#". <asp:Repeater ID="Repeater

asp.net获得数据控件事件索引并获取其中值总结_实用技巧

复制代码 代码如下: 1.RowCommad //获得索引 int index = ((GridViewRow)(((Button)(e.CommandSource)).Parent.Parent)).RowIndex; 2.RowEditing等 //获得索引 int index = e.NewEditIndex; //获取当前GridViewRow对象 GridViewRow editGridViewRow = autoGridView.Rows[girdviewEditIndex]; //

介绍几个ASP.NET中容易忽略但却很重要的方法函数_实用技巧

给大家介绍几个.NET中Path类的几个方法: 1.  Path.combine(string, string)     根据给出的两个路径, 返回一个路径.     例如:      string CompletePath = System.IO.Path.Combine(@"c:\MyApp", @"Images\skyline.jpg");    将会返回一个全路径 c:\MyApp\Images\skyline.jpg    第一个参数中有无"\&

asp.net服务器端指令include的使用及优势介绍_实用技巧

      asp.net中的服务端包括指令简单点就是一个<!-- #include file|virtual="filename" –>这样的指令,msdn中的名词解释是:将指定文件的内容插入 ASP.NET 文件中,包括网页(.aspx 文件).用户控件文件(.ascx 文件)和 Global.asax 文件.插入静态文件这个基本功能就不说了,插入aspx.ascx,这功能算是挺强了,asax哥就有点困惑了,这个暂且不管,今天要说的就是这个指令. 尴尬的存在     服