Processing Postback Data
For a control to be able to examine form data that is posted back by the client, it must implement the System.Web.UI.IPostBackDataHandler interface. The contract of this interface allows a control to determine whether its state should be altered as a result of the postback and to raise appropriate events. The IPostBackDataHandler interface contains two methods.
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
Upon postback, the page framework searches the posted content for values that match the UniqueIDs of server controls that implement IPostBackDataHandler. It then sequentially invokes LoadPostData on each control that implements this interface. The two arguments of LoadPostData are: a key that identifies the control and a collection, NameValueCollection, that contains the posted data. LoadPostData is typically implemented to update the state of a control as a result of the postback. The following example shows an implementation of LoadPostData for a custom text box control.
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
If the state of the control is changed as a result of the postback, LoadPostData returns true; otherwise, it returns false. The page framework keeps track of all the controls that return true and invokes RaisePostDataChangedEvent on those controls. Change events, if any, are raised from this method. Postback data processing thus occurs in two phases — updating state and raising change notifications. This prevents change notifications from being raised during postback data loading, when they could incorrectly alter state before all controls have a chance to load postback data. The following code fragment shows an implementation of RaisePostDataChanged for a custom text box control.
public virtual void RaisePostDataChangedEvent() {
OnTextChanged(EventArgs.Empty);
}
[Visual Basic]
Public Overridable Sub RaisePostDataChangedEvent()
OnTextChanged(EventArgs.Empty)
End Sub
It is essential that the rendering logic assign the UniqueID to the name attribute of the control. Otherwise, the page framework will be unable to route postback data to your control. If your control emits multiple form elements, at least one of the elements must have a have a name attribute that corresponds to the UniqueID of the control. For an example of a custom control that emits multiple form fields, see Composition vs. Rendering. The following code fragment assigns the UniqueID to the name attribute.
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
For a sample of a custom text box control that participates in postback data processing, see Postback Data Processing Sample.