程序运行大致有两种:一种是线性的;一种是事件驱动的。线性的是指程序从步骤1,到步骤2,到步骤3,一直延续,直到最后一个步骤结束。与线性不同的是,实现驱动编程时对正在发生的事情一种反应;例如按键被按下了,更一般的是,事件一般都由用户的行为产生的,不过有些事件也能被系统引起。
ASP.NET有上千种事件,应用程序有事件,会话有事件,页面和大部分的服务器控件也能激起事件。所有的ASP.NET事件是在服务器端被处理的,一些事件是立即被投递到服务器端,有一些事件被保留知道下次页面被投递会服务器。由此,我们可以看出ASP.NET与传统的客户端应用程序的不同,传统的客户端程序,事件的激发和处理都在客户端,而在ASP.NET中事件一般是在客户端激发的都是在服务器端被处理。
事件参数(Events Arguments):
事件是用delegate进行实现的。一个delegate是一个指定处理方的方法(method)描述的封装。
按照传统,所有的ASP.NET处理器需要两个参数,没有返回值。第一个参数代表着激发事件的对象,一般它被称之为sender(尽管它有可能不需要);第二个参数称之为事件参数,包含事件的特殊信息,对于大多数参数,这种事件参数是一种EventArgs类型。因此一般的事件原型如下:
private void EventName (object sender, EventArgs e)
应用程序和会话事件(Application and Session Events):
应用程序事件:当一个程序启动时会激发Application_Start Event,这时候是初始化应用程序资源的最佳时期;而当程序结束的时候会激发Application_End Event,这时候需要关闭系统资源等善后工作。
会话事件:与应用程序相似,一个会话以从应用程序发出第一个页面请求为开始,以应用程序关闭会话或会话超时为结束。当会话开始时会激发一个Session_Start Event,同样的会话结束时会激发Session_End Event。
页面和控件事件(Page and Control Events):
页面(page)和控件(controls)都带有从Control class继承过来的事件(Event)。一些常见的页面和控件事件:
Event name |
Description |
DataBinding |
Occurs when the control binds to a data source |
Disposed |
Occurs when the control is released from memory |
Error |
For the page only; occurs when an unhandled exception is thrown |
Init |
Occurs when the control is initialized |
Load |
Occurs when the control is loaded to the Page object |
PreRender |
Occurs when the control is about to be rendered |
Unload |
Occurs when the control is unloaded from memory |
回发事件 VS 非回发事件 (Postback Versus Non-Postback Events):
回发事件(Postback Events)是指时间激发后要立即被投递至服务器端,一般是点击型事件,如Button.Click;与之对应的是许多事件不需要立即被投递到服务器端,例如Text.TextChanged事件,这些事件被缓存后直到下次投递出现的时候一起被送至服务器端。常见的回发式控件和非回发式控件:
Postback |
Non-postback |
Button |
BulletedList |
Calendar |
CheckBox |
DataGrid |
CheckBoxList |
DataList |
DropDownList |
FileUpload |
ListBox |
GridView |
RadioButtonList |
ImageButton |
RadioButton |
ImageMap |
TextBox |
LinkButton |
|
Menu |
|
Repeater |
|
IsPostBack属性:
页面对象提供了IsPostBack属性,它是一个只读的属性值,代表着页面是被初次加载还是为了响应客户端回发事件而被重新加载的。有许多昂贵的操作只需在初次加载时被执行,如果是重新加载的话这些操作无需再次执行。例如:
protected void Page_Load(Object sender, EventArgs e) { if (! IsPostBack) { // Do the expensive operations only the // first time the page is loaded. } }
VS2005中的事件:
VS2005 IDE自动处理需要实现事件的大部分操作。当你创建一个web 应用程序时,VS2005自动包含了代码嗅探器去处理页面加载事件:
Page_Load
Page_AbortTransaction
Page_CommitTransaction
Page_DataBinding
Page_Disposed
Page_Error
Page_Init
Page_InitComplete
Page_Load
Page_LoadComplete
Page_PreInit
Page_PreLoad
Page_PreRender
Page_PreRenderComplete
Page_SaveStateComplete
Page_Unload
多控件对应于一个事件处理器:(Multiple Controls to One Event Handler):
一个事件处理器能够处理来自于不同控件的事件。例如以下代码:
private void BtnClick(object sender, System.EventArgs e) { Button b = sender as Button; String buttonID = b.ID; switch (buttonID) { case "btnDoThis": // code to do this case "btnDoThat": // code to do that } // code to do stuff common to all the buttons }