用户会对界面做出各种操作,并希望得到系统的回应,这些用户界面的操作被.Net统称为事件(event,系统内部也会产生事件),而对应的系统回应称为事件处理。在《
随想四》中的Login页面,当用户点击btnLogin按钮后, btnLogin对象(这时它被称为事件源)大叫:"我被点啦,十年了,我终于第一次被点击啦,555~~~"但Button类本身并未定义相应的事件处理程序,那么又是谁来完成系统的实际响应操作呢?
在编写Login类时我们已经定义成员btnLogin_Click方法,并希望由此完成btnLogin.click事件的处理,但MS工程师在定义Button类时并不知道其作用,所以需要一个媒介将两者连接起来,这时我们不禁回想起《
随想七》中的委托。.net用EventHandler委托作为连接事件源与事件处理程序的媒介,将两者绑定:
// 该段程序为《随想四》中Login.aspx.cs的代码片段并有所修改 // EventHandler为System命名空间中定义的公共委托 // sender为事件源对象,EventArgs类负责收集事件数据 public delegate void EventHandler(object sender,EventArgs e); // Login为受托类,完成事件处理定义和连结 public class Login : System.Web.UI.Page{ // Login.OnInit 为Page类受保护方法,执行创建和设置实例所需的初始化步骤 // 调用OnInit方法时引发 Init事件 override protected void OnInit(EventArgs e){ // new System.EventHandler生成一委托实例 // += 完成事件处理委托的连接过程,同一事件可以触发多个处理程序,称为多路广播 // base.OnInit(e)用于调用父类的同名方法 this.btnLogin.Click += new System.EventHandler(this.btnLogin_Click); base.OnInit(e); } private void btnLogin_Click(object sender, System.EventArgs e){……} } |
■ 苦旅 - ASP.NET的动态模型
每一个HTTP请求出发前可谓悲壮,壮士一去兮不复返!Login.aspx页面请求将URL和相关数据打包背上,胸前挂着自己的IP地址身份牌,从客户端浏览器出发,翻越电信网通人为制造的各种障碍,爬雪山过草地,步履蹒跚地走到Web服务器的IIS门前,正想狂喜一阵,当看到大门口排着长长的数以万计的请求队列,还常有些饿死骨无人理彩时,它终于倒下了。
矇眬中Login.aspx页面请求被传送到HttpRuntime实例,HttpRuntime实例将:
·获取一个HTTP Application 对象;
·让HTTP Application 对象读取配置文件;
·由HTTP Module 实例们分别提供会话维护、验证或配置文件维护等各项服务;
·HTTP Handler接口实例化具体Page类实现处理。
Login是HTML页面生产车间的工人,每天他负责按照严格的标准和固定的流程为客户制作HTML编码的Login.aspx页面。一天早上,login正在硬盘里惬意地喝着咖啡,身宽体胖的主管HttpHandler大叔通知他立即开工。
今天是第一次进入内存,所以他先准备好页面构架和所有控件零件并设置其默认状态;然后严格按OnInit方法完成Init事件;之后会在页面请求中寻找_VIEWSTAT。如果找到就对数据进行读取和解码;并让控件更新其状态以准确反映客户端相应元素状态; 随后他拿出OnLoad方法操作手册来处理Load事件;然后应付一系列被触发的页面事件,如果页面正在被回送,还会包括用户触发的事件;用onPreRender方法处理的PreRender事件可以改变提交页面的方式;然后把当前的页面状态保存到新的视图状态中。
完成所有操作后即可生成HTML编码文件,期间可通过覆写(override)Render方法以附加一些HTML代码,为页面做最后的修饰。
最后Login释放所有占用的文件、图形对象、数据库连接等关键资源,匆忙跑出内存,"真是太闷了!"出门时他小声地嘀咕了一声。
查看本文来源