ASP.NET可以保存页面各个控件的状态数据,通过控件的操作使页面表单提交到本页时,虽然经过了浏览器和服务器的往返,状态数据仍然可以保持。根据这些状态的变化,服务器端可以决定是否触发指定控件的事件,并执行相应的事件处理方法。 【分析】 这个面试题主要考查面试者对ASP.NET中事件回传机制的认识。类似于桌面软件开发的程序,在页面中插入一个服务器控件(如Button),双击该控件即可编写其默认事件处理方法的代码。当浏览用户在浏览器端操作这个服务器控件所生成的HTML控件(如单击表单按钮控件)时,将触发开发时所编写的默认事件(如单击为“Click”事件),并执行所编写的事件处理方法。在WinForm程序中,这种开发方式再正常不过,不过在WEB开发领域,ASP.NET通过事件回传机制完成这组操作。因为HTTP协议是无状态的协议,当服务器把页面发送给浏览器端后,程序即执行完毕,不保留任何信息。 回传即PostBack,关键在于ASP.NET的回传机制可在浏览器端的页面中保存各个控件的状态数据,即使页面提交到服务器并返回本页时,这些数据仍然存在。在VS 2008中添加新的WEB窗体项到NetWeb项目,并命名为PostBack.aspx。编写PostBack.aspx如代码11.10所示。 代码11.10 服务器控件事件回传:PostBack.aspx %@ Page Language=”C#” AutoEventWireup=”true” CodeBehind=”PostBack.aspx.cs” Inherits=”NetWeb.PostBack” %>
回传机制 以上页面代码中添加了3个常用的服务器控件,并且其设置了对应的Click事件处理方法,这些方法定义于PostBack.aspx.cs文件中。编写PostBack.aspx.cs如代码11.11所示。 代码11.11 服务器控件事件回传逻辑代码:PostBack.aspx.cs using System; ………………………………… namespace NetWeb { public partial class PostBack : System.Web.UI.Page { //btn1控件的事件处理方法,直接读取其Text属性 //在回传页面到浏览器端时将这个属性值赋值给lb控件的Text属性 protected void btn1_Click(object sender, EventArgs e) { this.lb.Text = “您单击了” + this.btn1.Text; } //btn2控件的事件处理方法,获取引起事件的sender对象,并将类型转换为Button //在回传页面到浏览器端时将bt的“Text”属性值赋值给lb控件的Text属性 protected void btn2_Click(object sender, EventArgs e) { Button bt = (Button)sender; this.lb.Text = “您单击了” + bt.Text; } //linkbtn控件的事件处理方法,获取引起事件的sender对象,并将类型转换为LinkButton //在回传页面到浏览器端时将lbt的“Text”属性值赋值给lb控件的Text属性 protected void linkbtn_Click(object sender, EventArgs e) { LinkButton lbt = (LinkButton)sender; this.lb.Text = “您单击了” + lbt.Text; } } } 逻辑代码中的事件处理方法,用了两种方式获取触发事件的对象,其作用是一样的。当浏览用户访问PostBack.aspx页面时,单击三个控件中的一个,将提交页面的表单,回传页面时将使用lb(Label控件)控件显示被单击控件的“Text”属性值。初次接触ASP.NET的编程者会对数据的保持感到疑惑,例如,页面回传时,服务器怎么知道是哪个控件引起页面回传的。每个控件的“id”属性等属性被保存到ViewState中,提交表单到服务器后即可判断是哪个控件引发的页面回传,即可在服务器端引发对应控件的事件,进而执行事件处理方法。同时ViewState还可以保持控件的“Text”属性值(如果有),所以以上例子的事件处理方法中将“Text”属性值进行赋值操作。