当前位置:  编程技术>.net/c#/asp.net

Asp.Net事件模型总结

    来源: 互联网  发布时间:2014-08-30

    本文导语:       Asp.Net是事件驱动模型。   1.在页面第一次运行时,Asp.Net创建页面和控件对象,接着执行初始化代码,然后页面被呈现为HTML并返回到客户端,页面对象在服务器内存中被释放掉。   2.用户在某点触发某个会送时,例...

     Asp.Net是事件驱动模型。

  1.在页面第一次运行时,Asp.Net创建页面和控件对象,接着执行初始化代码,然后页面被呈现为HTML并返回到客户端,页面对象在服务器内存中被释放掉。

  2.用户在某点触发某个会送时,例如单击某个按钮,页面所有的表单数据被提交。

  3.Asp.Net截获这些返回的页面并重建页面对象,准确还原对象在页面被发送到客户端时的最后状态。

  4.Asp.Net检查是什么操作触发了会送,引发相应的事件。

  5.修改后的页面转化成HTML并返回到客户端。页面对象在服务器端从内从中释放掉。

附,ASP.NET的事件模型与实例介绍

新建一个ASP.NET的应用程序时,会默认生成一个Default.aspx和Default.aspx.cs页面。
在Default.aspx的页面中第一行是一条页面指令:
 

其中CodeBehind属性指定代码隐藏页面的名称,Inherits指定所属的命名空间和类,AutoEventWireup属性是可以赋值为true和false,默认是赋值为true。
先在Default.aspx页面中放入两个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注册事件是有效的。

 1 2 下一页 尾页

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Asp.net禁用页面缓存的方法总结
  • c#(asp.net)线程配置总结
  • asp.net 常用Request信息总结
  • ASP.NET中常见文件类型、扩展名、存放位置及用途总结
  • ASP.NET之 Ajax相关知识介绍及组件图
  • 我想了解一些关于Java怎样与Asp或Asp.net结合方面在未来发展方向的问题?
  • c#/ASP.NET操作cookie(读写)代码示例
  • asp.net UrlEncode对应asp urlencode的处理方法
  • asp.net实例 定义和使用asp:AccessDataSource
  • win2008 r2 服务器环境配置(FTP/ASP/ASP.Net/PHP)
  • asp与asp.net的session共享
  • 如何在unix下发布asp?
  • 怎么让Apache支持Asp?
  • ??谁能把ASP代码改为JSP的
  • Linux平台下哪种方法实现ASP好?
  • ASP和ASP.Net共享Session解决办法
  • 通过socket和asp打交道
  • 犹豫中……,到底是选择ASP,还是JSP?
  • asp 是否 可用applet标签?帮忙!!
  • asp.net判断数据库表是否存在 asp.net修改表名的方法
  • 新人提问:asp+access的程序在linux下怎么改?
  • 用JAVA APPLET做的交互式网页和ASP、PHP做的相比有什么优势呢?
  • asp.net文字水印功能简单代码
  • asp里面可否使用java写的邮件,给30分.
  • asp与Jsp可否在iis中共存的问题


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3