Traitement des données de publication
Pour qu'un contrôle puisse examiner des données de formulaire publiées par le client, il doit implémenter l'interface System.Web.UI.IPostBackDataHandler. Le contrat de cette interface permet à un contrôle de déterminer si son état doit être modifié à la suite de la publication et de déclencher les événements appropriés. L'interface IPostBackDataHandler contient deux méthodes.
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
Lors de la publication, l'infrastructure de page recherche le contenu publié afin de trouver les valeurs correspondant aux UniqueID des contrôles serveur qui implémentent IPostBackDataHandler. Elle appelle ensuite successivement LoadPostData sur chaque contrôle qui implémente cette interface. Les deux arguments de LoadPostData sont les suivants : une clé qui identifie le contrôle et une collection, NameValueCollection, qui contient les données publiées. LoadPostData est généralement implémenté pour mettre à jour l'état d'un contrôle à la suite de la publication. L'exemple suivant illustre une implémentation de LoadPostData pour un contrôle de zone de texte personnalisé.
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
Si l'état du contrôle est modifié à la suite de la publication, LoadPostData retourne true ; sinon, il retourne false. L'infrastructure de page assure le suivi de tous les contrôles qui retournent true et appelle RaisePostDataChangedEvent sur ces contrôles. Les événements de modification éventuels sont déclenchés par cette méthode. Le traitement des données de publication se produit donc en deux phases : la mise à jour de l'état et le déclenchement de notifications de modification. Cela permet d'éviter que les notifications de modification soient déclenchées pendant le chargement des données de publication, car elles pourraient modifier l'état de manière erronée avant que tous les contrôles aient une chance de charger les données de publication. Le fragment de code suivant illustre une implémentation de RaisePostDataChanged pour un contrôle de zone de texte personnalisé.
public virtual void RaisePostDataChangedEvent() {
OnTextChanged(EventArgs.Empty);
}
[Visual Basic]
Public Overridable Sub RaisePostDataChangedEvent()
OnTextChanged(EventArgs.Empty)
End Sub
Il est essentiel que la logique de rendu assigne UniqueID à l'attribut de nom du contrôle. Sinon, l'infrastructure de page est incapable d'acheminer les données de publication vers votre contrôle. Si votre contrôle émet plusieurs éléments formulaire, au moins un d'eux doit posséder un attribut de nom correspondant à l'UniqueID du contrôle. Pour obtenir un exemple d'un contrôle personnalisé qui émet plusieurs champs de formulaire, consultez Composition et rendu. Le fragment de code suivant assigne UniqueID à l'attribut de nom.
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
Pour obtenir un exemple d'un contrôle de zone de texte personnalisé qui participe au traitement des données de publication, consultez Exemple de traitement des données de publication.