處理回傳資料
對於能夠檢查用戶端回傳的表單資料的控制項,它必須實作 System.Web.UI.IPostBackDataHandler 介面。這個介面的合約可以讓控制項判斷其狀態是否要因回傳而改變,並引發適當的事件。IPostBackDataHandler 介面包含兩個方法。
public interface IPostBackDataHandler{
public bool LoadPostData(string postDataKey,
NameValueCollection postCollection);
public void RaisePostDataChangedEvent();
}
[Visual Basic]
Public Interface IPostBackDataHandler
Public Function LoadPostData(postDataKey As String, _
postCollection As NameValueCollection) As Boolean
Public Sub RaisePostDataChangedEvent()
End Interface
回傳時,網頁架構會在張貼的內容搜尋符合伺服器控制項 (實作 IPostBackDataHandler) UniqueID 的值。它接著在實作這個介面的各個控制項上循序叫用 LoadPostData。LoadPostData 的二個引數是:識別控制項的金鑰和包含張貼資料的集合 NameValueCollection。LoadPostData 基本上被實作為會因回傳而更新控制項的狀態。下列範例針對自訂文字方塊控制項示範 LoadPostData 的實作。
public virtual bool LoadPostData(string postDataKey, NameValueCollection postCollection) {
string presentValue = Text;
string postedValue = postCollection[postDataKey];
if (!presentValue.Equals(postedValue)){
Text = postedValue;
return true;
}
return false;
}
[Visual Basic]
Public Overridable Function LoadPostData(postDataKey As String, postCollection As NameValueCollection) As Boolean
Dim presentValue As String = Text
Dim postedValue As String = postCollection(postDataKey)
If Not presentValue.Equals(postedValue) Then
Text = postedValue
Return True
End If
Return False
End Function
如果控制項的狀態由於回傳而變更,LoadPostData 傳回 true;否則傳回 false。網頁架構記錄所有傳回 true 的控制項,並在那些控制項上叫用 RaisePostDataChangedEvent。變更事件 (若有的話) 會從這個方法引發。回傳資料處理因此將發生於兩個階段 - 更新狀態和引發變更告知。當它們在所有控制項有機會載入回傳資料之前不正確地變更狀態時,這將防止變更告知在回傳資料載入期間被引發。下列程式片段針對自訂文字方塊控制項示範 RaisePostDataChanged 的實作。
public virtual void RaisePostDataChangedEvent() {
OnTextChanged(EventArgs.Empty);
}
[Visual Basic]
Public Overridable Sub RaisePostDataChangedEvent()
OnTextChanged(EventArgs.Empty)
End Sub
呈現邏輯指派 UniqueID 給控制項的 name 屬性,是必要的。否則,網頁架構將無法轉送回傳資料至您的控制項。如果您的控制項發出多個表單項目,至少其中一個項目必須具有對應至控制項的 UniqueID 的 name 屬性。如需發出多個表單欄位的自訂控制項的範例,請參閱撰寫和呈現的比較。下列程式片段指派 UniqueID 給 name 屬性。
protected override void Render(HtmlTextWriter output)
{
output.AddAttribute(HtmlTextWriterAttribute.Type, "text");
output.AddAttribute(HtmlTextWriterAttribute.Value, this.Text);
output.AddAttribute(HtmlTextWriterAttribute.Name, this.UniqueID);
output.RenderBeginTag(HtmlTextWriterTag.Input);
output.RenderEndTag();
}
[Visual Basic]
Protected Overrides Sub Render(output As HtmlTextWriter)
output.AddAttribute(HtmlTextWriterAttribute.Type, "text")
output.AddAttribute(HtmlTextWriterAttribute.Value, me.Text)
output.AddAttribute(HtmlTextWriterAttribute.Name, me.UniqueID)
output.RenderBeginTag(HtmlTextWriterTag.Input)
output.RenderEndTag()
End Sub
如需參與回傳資料處理的自訂文字方塊控制項的範例,請參閱回傳資料處理範例。