Programming ASP.NET 学习笔记(要点)第3章 控件:基本概念

事件

执行程序有两种模式(二者并不是非此即彼的关系):线性模式和事件驱动模式。理解asp.net 的关键是,它是事件驱动模式。
线性模式的程序从第一步开始执行,然后执行第二步等,直至所有步骤执行完为止。代码中的流程控制结构(如循环、if块或方法调用)也许可以重定位程序的流,然而,就本质而言,一但程序开始执行,在用户或系统的操作下,它一直运行下去。在有GUI环境之前,大多数计算机程序都是线性模式。
相反,事件驱动模式的程序是当发生某些事情进行响应(例如按下了按钮)。多数情况下,事件由用户行为生成,但是由系统触发。例如,您打开了准备阅读的文件,当它被读进内存时,或者当电池电量的时候,系统会触发一个事件。
在asp.net 中,对象可以触发事件,而其他对象可以定义事件处理程序。例如,单击按钮触发Click事件,那么页面则可以用一个方法来处理按钮的单击事件(例如Button1_Click)。
这里要牢记的重点是:服务器控件是可以触发事件的对象。用户在浏览器上对服务器控件所执行的任何行为都可以触发事件。服务器端代码响应事件,并运行存储在事件处理方法中的代码。

asp.net 事件

asp.net有数千个事件。应用程序有事件(如应用程序的开始和结束),每一个会话也有事件(如会话的开始和结束),并且页面和多数服务器控件都会触发事件)。所有的ASP.net 事件都在服务器端处理。有些事件立刻发送到服务器,另外有一些事件则被存储,直到下此页面回传到服务器。
考虑一个包含按钮控件的asp.net页面。当单击该按钮时,触发了一个Click事件。不同于HTML按钮控件,asp.net的按钮有一个runat=server属性,它为所有HTML按钮的标准功能添加服务器端处理属性。

事件参数

事件依靠委托实现。委托是一个对象,它封装了对方法的描述,即处理事件所指定的任务。根据惯例,所有asp.net事件处理程序都有两个参数,并且返回空值。第一个参数表示触发事件的对象。习惯性的称之为sender,尽管这不是必要的。
第二参数称作事件参数,它包括事件信息的细节,如果有的话。对于多数事件,事件参数是EventArgs类型,它没有任何属性,因此,事件的通用原型为:
private void EventName(object sender,EventArgs e)


对于某些控件,事件参数可以从EvenArgs类派生,并显示该事件类型的属性细节。例如,AdRotator控件的AdCreated事件处理程序,接收AdCreateEventArgs类型的参数,它有AdProperties、AlternateText、ImageUrl和NavigateUrl属性。

应用程序事件和会话事件

Asp.net 支持应用程序事件和会话事件。当应用程序启动时,将触发Application_Start事件。这时可以初始化整个应用程序中需要使用的各种资源,例如,数据库连接字符串(而不是数据库连接对象本身)。当应用程序停止时,将触发Application_End事件。这时,可以关闭资源,同时执行任何其他必要的日常管理。会话事件也是如此。当用户第一次请求应用程序的页面是,会话开始。当应用程序关闭会话和会话超时,会话结束。当会话开始时,触发Session_Start事件,这时,可以初始化会话生命周期中使用的资源,例如,打开数据库连接。页面和控件事件页面和控件都包含事件,他们继承自control类(在Error事件的情况下,则继承自TemplateControl类)。所有这些事件传递没有属性的EventArgs类型的事件参数。

回传事件VS非回传事件

回传事件促使表单立刻回传到服务器。这包括单击类型的事件,例如Button.Click。与之相对的是,某些事件(典型的有修改事件,例如TextBox.TextChange,或者选择事件,例如CheckBox.CheckedChanged)被认为是非回传的。因为,事件并不立刻回传到服务器。这些事件由控件捕获,直到再次发生回传。设置非回传事件控件的AutoPostBack属性为True,则可以使他们采用回传方式。

IsPostBack

Page对象具有IsPostBack属性。这是一个只读的Boolen类型属性,它可以指示页面是第一次加载还是为了响应客户端回传而进行的加载。您可以只在页面第一次加载时,执行一些耗费资源的操作(例如,从数据库获取数据或构造列表项)。若果页面回传到服务器并再次加载,就无需重复这些操作了。因为,任何输入或构建的数据都已保留(参见,使用视图状态)到后续的回传中。

下面这段代码由于测试IsPost属性,它跳过了之前提到的耗时资源的操作:

protected void Page_Load(Object sender,EventArgs e)
  {
   if (!IsPostBack)
    {
       //仅在页面第一次加载时,执行重要操作
    }
  }


多个控件共同使用一个事件处理程序

一个事件处理程序可以处理来自多个不同控件的事件。例如,有一个普通的按钮单击事件处理程序,它可以处理窗体上所有按钮的单击事件。通过测试sender参数值,可以 确定触发事件的具体按钮。在下面的代码段中,单击按钮的事件处理程序将sender对象(也就是触发事件的控件)转换为Boutton类型,然后,将该按钮的ID属性赋予值给一个字符串变量。

private void BtnClick(object sender,System.EventArgs e)
{
  Button b = sender as Button;
  String buttonID = b.ID;
  switch (buttonID)
     {
      case "btnDoThis":
      //DoThis的代码
      case "btnDoThat":
      //DoThat的代码
     }
}


ASP.NET 服务器控
在asp.net中,最为重要的是ASP.NET服务器控件。服务器控件包含方法以及与之关联的事件处理程序,并且这些代码都在服务器端执行。(部分服务器控件也提供客户端脚步,尽管如此,这些控件事件仍然会在服务器端处理)
实现asp.net服务器控件的语法:
<asp:controlType id="ControlID" runat="server" thisProperty="this value"
thatProperty="that value" />

控件标签总是以asp:开头,这就是标记前缀。controlType是控件的类型或类,例如,Button、CheckBoxList或GridView。您可利用id属性,以编程方式引用控件实例。runat属性告知服务器,该控件在服务器端运行。

posted @ 2008-09-13 23:00  wencx  阅读(296)  评论(0)    收藏  举报