ASP.NET提供了一种基于事件的程序设计模式,这种模式在一定程度上简化了网络程序的设计过程。在我以前的“ASP.NET:革命,不是革新。”这篇文章中,我描述了一个简单的ASP.NET Greeter程序,这个程序是用来制作一个单一的点击按钮。在这个应用程序中,事件处理器是附加在控制网络服务按钮上面的。
在本篇文章里,我通过这个程序向大家演示出如何为控制级以及页面级的事件来粘贴事件处理器。我同时还会同广大读者讨论ASP.NET的整体结构,并向大家演示使用者在使用这款应用软件的过程中能够处理的各种事件。
让我们来看一看经过修订的Greeter页面。请看在列表A中的Greeter.aspx,以及展示于列表B Greeter.aspx.cs中的 GreeterLogic逻辑。在这里的用户界面以及逻辑是通过@ Page中位于Greeter.aspx顶端的详细说明来联接在一起的。与过去通过GreeterLogic.OnInit代表程序来手动的粘贴点击按钮处理器相比(我把有关这部分的内容放在了OnInit的注释中。),现在的做法是将事件处理器明确的粘贴在Greeter.aspx上,这种做法要比以前的做法为好。<asp:Button>网络服务的控制,就在<form>标签里,包括了OnClick="Button_Click"的这些属性。当ASP.NET运行Greeter.aspx的时候,这个软件会生成一个.NET类型的文件,这个文件会自动处理那些原来必须手动操作的工作。这个文件会在基础层次GreeterLogic上创建一个Button_Click的代表程序,并且把这个生成的代表程序添加到这个点击按钮事件上。
较少的工作量通常的来说是一件好事,但是,还有其它一些不同的看法。因为.NET种类的软件是在第一次访问页面的时候动态的生成的,所以,与此同时可能生成的一些错误,如果这些软件不被运行的话,是不可能被发现的。
GreeterLogic的基础类别System.Web.UI.Page让一些处于页面层次的事件露出了真实面目。这些事件提供了关于页面的生命周期的各种报告,比如报告大家页面正在处于被初始化状态,装载运行的状态,或者是正在处于卸载的状态。在GreeterLogic中包括了这些事件的每一个处理器。这些事件处理器能够被手动的粘贴。事实上,GreeterLogic.OnInit的内部包含了处理以上那些事件的程序代码。另外,作为替换的是,页面层次的事件处理器是利用在Greeter.aspx 顶端被指明的@ Page 中的AutoEventWireup功能自动被粘贴的。当AutoEventWireup被设置成为true的时候,在这个页面中的事件处理器是被自动的粘贴到页面事件上边的。以上的这些工作并不需要您自己手动的完成,因此,这就大大的减轻了您的工作量。但是,再一次的,出于谨慎的原因。你不能选择你自己的名字。这些事件处理器必须拥有Page_Event表格上面可以预测的的名字。如果你对一个事件处理器的命名不正当的话,那么,这个事件处理器就不会被粘贴到它的对象事件上边,同时,不会有任何关于错误信息的提示或者警告在你的面前出现。如果你选择了AutoEventWireup,并且你的事件处理器还没有被命名,那么,你需要做的第一件事情就是要检查一下事件处理器的名字(取一个合理的名字)。
在GreeterLogic中调用每一个页面层次的事件处理器操作,都会被记录到在Log.cs中的记录文件中,就如同列表C中所示的那样。LogCall记录这些操作的方法是通过System.Diagnostics.StackTrace检查运行调用堆栈来实现的。如果想获得详细的资料,就请查阅Log.cs中内带的文件。调用页面的Page_Load事件处理器同样也在日志文件中标注上此页面的IsPostBack的状态入口。Page.IsPostBack特性能够让你测定,是否正在被调用的页面对于一个初始化请求有所响应,还是对正在被提交的页面有所响应。在本篇文章的稍候部分,我们将会在日志文件中来看一看那些已经完成的事件的序列。