為自定義服務器控件實現事件,是一個比較復雜的過程。開發人員不僅需要根據上一篇文章中介紹的方法,實現捕獲回傳事件,而且有時候還需要參與回傳數據處理過程。本文將通過典型應用介紹處理回傳數據的方法。
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;
}