疯子的博客

做一件事,专注一件事
关于Asp.net web控件事件处理的一点理解

 


 

突然对web控件起了点兴趣,好像这些都已经不那么热门了,但是了解一下web控件对asp.net的运行机制的理解也会得到点提升,小弟是只是个业余选手,菜鸟中的菜鸟,网上的资料看了半天感觉太专业,不照顾我等小鸟,写点自己的体会,还望高手指出错误。

 

先看asp.net的生命周期:

1.实例化(Instantiate 
2.
初始化(Initialize 
3.
跟踪视图(Tracking View State 
4.
加载视图状态(Load view state*
5.
加载回传数据(Load postback data: 只会在回传过程中调用此方法。 
6.
开始载入(Load  
7.
唤起事件处理(Raise changed events* 
控件生成后,数据被客户端更改过,和加载回传数据是一路的。 
8.
唤起回传数据事件处理(Raise postback event* 
一般用于实现IPostBackEventHandler接口的控件的把客户端事件转化成服务器端事件。只用于回传过程。 
9.
生成预处理(PerRender** 
生成前期工作,通过重载OnPreRender方法实现自定义。 
10.
保存视图状态(Save view state* 
如果所以信息都是用ViewState[xxx]这种方式来保存,不必重载,只有自定义视图状态管理时才重载此方法,

11.生成(Render):页面呈现。 
12.
卸载(Unload 
13.
释放(Dispose 

 

 

注意:

1.各个 ASP.NET 服务器控件都有自己的生命周期,该生命周期与页生命周期类似。例如,控件的 Init  Load 事件在相应的页事件期间发生。

2.虽然 Init  Load 都在每个控件上以递归方式发生,但它们的发生顺序相反。每个子控件的 Init 事件(还有 Unload 事件)在为其容器引发相应的事件之前发生(由下到上,先是子控件的init事件)。但是,容器的 Load 事件是在其子控件的 Load 事件之前发生(由上到下)。(可以重载这些方法再下断点观察)

3.各个生命阶段大致是同步的,也就是说初始化时事各个控件都初始化,都完成之后才进入下个阶段。(很明显的是不是)

4. 如果控件是在运行时动态创建的,或者是以声明方式在数据绑定控件的模板中创建的,它们的事件最初与页上的其他控件的事件并不同步。例如,对于运行时添加的控件,Init  Load 事件在页生命周期中的发生时间可能要比以声明方式创建的控件的相同事件晚得多。

 

下面是个控件事件处理的例子

Code

 

 

 

 

 

 

 

调用此控件的页面代码:

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

 

<%@ Register Assembly="HyperTextControl" Namespace="HyperTextControl" TagPrefix="cc1" %>

 

<!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>

    
<form id="form1" runat="server">

    
<div>

        
<cc1:WebCustomControl ID="WebCustomControl2" OnMPClick="WebCustomControl2_MPClick" runat="server"  />

    
</div>

    
</form>

</body>

</html>

 

 

现在大致分析一下页面的流程:

1.       客户端发送请求,可能是用submit按钮提交,也可能是__doPostBack事件引起的。

2.       事件通过一系列的传送到达我们的页面处理类,这里是Default.aspx对应的类

3.       页面开始按照前文提到的生命周期运行。初始化各个对象(页面对象,子控件对象……,这里给子控件定义了事件对象,Events.AddHandler(EventClick,value)添加了事件的委托函数),递归调用。Init(),load(),

4.       到达onload(),判断是不是页面回发的事件,如果是,把事件传递到事件对应的控件,

5.       控件调用RaisePostBackEvent唤起事件对象上的委托。(这里是EventClick对象)

6.       因为初始化的时候有OnMPClick="WebCustomControl2_MPClick" EventClick上的委托不为空,调用clickHandler(this,e)WebCustomControl2_MPClick函数得以调用。

7.       预呈现,

8.       其它之前提到的生命阶段。

 

posted on 2009-09-30 14:14  老陈  阅读(365)  评论(0)    收藏  举报