Verarbeiten von Postback-Daten
Um Formulardaten untersuchen zu können, die vom Client zurückgesendet wurden, muss das Steuerelement die System.Web.UI.IPostBackDataHandler-Schnittstelle implementieren. Durch den über diese Schnittstelle definierten Vertrag kann für ein Serversteuerelement festgelegt werden, ob sein Zustand aufgrund der zurückgesendeten Daten geändert und entsprechende Ereignisse ausgelöst werden müssen. Die IPostBackDataHandler-Schnittstelle enthält zwei Methoden.
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
Nach dem Postback wird vom Seitenframework der gesendete Inhalt für jene Werte gesucht, die mit den UniqueIDs der Serversteuerelemente übereinstimmen, bei denen die IPostBackDataHandler-Schnittstelle implementiert ist,. Danach wird nacheinander die LoadPostData-Methode jedes Steuerelements aufgerufen, bei dem die Schnittstelle implementiert ist. Die beiden Argumente von LoadPostData sind: der Schlüssel, mit dem das Steuerelement identifiziert wird, und die Auflistung NameValueCollection, in der sich die gesendeten Daten befinden. LoadPostData ist üblicherweise so implementiert, dass infolge des Postbacks der Zustand des Steuerelements aktualisiert wird. Im folgenden Beispiel wird die Implementierung von LoadPostData für ein benutzerdefiniertes Textfeld-Steuerelement gezeigt.
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
Wenn sich infolge des Postbacks der Zustand des Steuerelements geändert hat, wird von LoadPostData der Wert true zurückgegeben; andernfalls der Wert false. Durch das Seitenframework werden alle Steuerelemente verfolgt, die den Wert true zurückgegeben haben. Bei diesen Elementen wird RaisePostDataChangedEvent aufgerufen. Liegen Änderungsereignisse vor, werden sie durch diese Methode ausgelöst. Die Verarbeitung von Postback-Daten erfolgt in zwei Phasen – Aktualisierung des Zustands und Auslösen der Änderungsbenachrichtigungen. Dadurch wird verhindert, dass Änderungsbenachrichtigungen bereits während des Ladens der Postback-Daten ausgelöst werden. Das könnte fälschlicherweise dazu führen, dass der Zustand geändert wird, noch bevor alle Steuerelemente die Möglichkeit hatten, die Postback-Daten zu laden. Im folgenden Codefragment wird die Implementierung von RaisePostDataChanged für ein benutzerdefiniertes Textfeld-Steuerelement gezeigt.
public virtual void RaisePostDataChangedEvent() {
OnTextChanged(EventArgs.Empty);
}
[Visual Basic]
Public Overridable Sub RaisePostDataChangedEvent()
OnTextChanged(EventArgs.Empty)
End Sub
Es ist unbedingt notwendig, dass durch die Wiedergabelogik die UniqueID mit dem Name-Attribut des Steuerelements verknüpft wird. Andernfalls ist das Seitenframework nicht in der Lage, die Postback-Daten zu den entsprechenden Steuerelementen weiterzuleiten. Wenn von dem Steuerelement mehrere Formularelemente gesendet werden, muss das Name-Attribut mindestens eines Elements mit der UniqueID des Steuerelements übereinstimmen. Ein Beispiel für ein benutzerdefiniertes Steuerelement, das mehrere Formularfelder versendet, finden Sie unter Vergleich von Komposition und Wiedergabe. Im folgenden Codefragment wird die UniqueID mit dem Name-Attribut verknüpft.
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
Ein Beispiel für ein benutzerdefiniertes Textfeld-Steuerelement, das an der Verarbeitung von Postback-Daten teilnimmt, finden Sie unter Beispiel für die Verarbeitung von Postback-Daten.