为自定义服务器控件实现事件,是一个比较复杂的过程。开发人员不仅需要根据上一篇文章中介绍的方法,实现捕获回传事件,而且有时候还需要参与回传数据处理过程。本文将通过典型应用介绍处理回传数据的方法。
1. 实现处理回传数据 在上一篇文章介绍的捕获回传事件过程中,往往都不涉及回传到服务器的控件数据。开发人员主要实现IPostBackEventHandler接口就能够成功捕获事件,并为之定义事件处理程序。然而,有些服务器控件在应用过程中,涉及回传数据的变化等情况。例如,自定义控件是一个输入控件,当用户输入并回传后,可能会由于回传数据的变化而引发一些事件。为了处理以上问题,控件类必须实现IPostBackDataHandler接口。下面列举了接口声明代码。
public interface IPostBackDataHandler{ public bool LoadPostData ( string postDataKey, NameValueCollection postCollection ); public void RaisePostDataChangedEvent ();} |
IPostBackDataHandler接口用于在创建需要由客户端回传到服务器的窗体数据的服务器控件时使用。如上代码所示,该接口包括两个方法,LoadPostData和RaisePostDataChangedEvent。
与实现捕获回传事件类似,仅仅在控件类中实现接口是不完整的。下面总结了为了实现处理回传数据而必须实现的两个要点。
第一、必须在控件呈现中将控件的name的属性值设置为UniqueID。这是由于发生回传后,页框架将在发送的内容中搜索与实现IPostBackDataHandler的服务器控件的UniqueID匹配的值,然后才能调用LoadPostData方法。
第二、控件类必须实现IPostBackDataHandler接口,并实现LoadPostData和RaisePostDataChangedEvent方法。LoadPostData方法用来检查提交给服务器的数据。该方法包含两个参数:postDataKey表示用于识别控件内数据的关键值,postData是提交数据的集合,其采用Key/Value结构便于使用索引名称访问。要访问集合中的控件数据,只要采用如下代码即可:"string nData = postData[postDataKey]; "。在LoadPostData方法中,通过新数据(客户端发送的数据值)与旧数据(先前提交给客户端的数据值)进行比较的结果来确定方法返回值。如果新旧数据相同,则说明数据没有被修改,方法返回值为false;如果新旧数据不同,则表明旧数据已经被客户端修改,方法返回值true。下面是LoadPostData方法的一个简单应用。
public virtual bool LoadPostData(string postDataKey,NameValueCollection postData) { string presentValue = Text; //旧数据 string postedValue = postData[postDataKey];//新数据 //检查新旧数据 if(presentValue.Equals(postedValue) || presentValue == null) { Text = postedValue; return true; } return false; } |
如果LoadPostData方法返回true,.NET框架将自动调用RaisePostDataChangedEvent方法。该方法用信号要求服务器控件对象通知ASP.NET应用程序该控件的状态已更改,控件开发者可以在该方法中定义根据数据变化引发的事件。下面是简单的调用OnTextChanged方法:
public virtual void RaisePostDataChangedEvent() { OnTextChanged(EventArgs.Empty); } |
以上是处理回传数据的实现要点,掌握这些要点对于事件处理具有至关重要的意义。同时,其内容也说明了以下.NET框架处理回传数据的过程:
(1)首先在发送的内容中搜索与实现IPostBackDataHandler的服务器控件的UniqueID匹配的值。
(2)调用LoadPostData方法,并返回bool值。
(3)如果LoadPostData方法返回true,那么调用RaisePostDataChangedEvent方法。
(4)执行RaisePostDataChangedEvent方法中定义的OnEvent方法。