Elaborazione dei dati di postback

Affinché un controllo sia in grado di esaminare i dati del form di cui il client ha eseguito il postback, è necessario implementare l'interfaccia System.Web.UI.IPostBackDataHandler. Il contratto di questa interfaccia consente a un controllo di determinare se il relativo stato deve essere modificato in seguito al postback e generare quindi gli eventi appropriati. L'interfaccia IPostBackDataHandler contiene due metodi.

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

Durante il postback, il framework di pagina cerca nel contenuto inserito i valori che corrispondono agli identificatori UniqueID dei controlli server che implementano l'interfaccia IPostBackDataHandler. Viene quindi richiamato LoadPostData in modo sequenziale su ciascun controllo che implementa questa interfaccia. I due argomenti di LoadPostData sono: una chiave che identifica il controllo e un insieme, NameValueCollection, contenente i dati inseriti. In genere, LoadPostData viene implementato per aggiornare lo stato di un controllo in seguito al postback. Nell'esempio riportato di seguito viene illustrata un'implementazione di LoadPostData per un controllo casella di testo personalizzato.

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
      

Se lo stato del controllo viene modificato in seguito al postback, LoadPostData restituisce il valore true, in caso contrario restituirà false. Il framework di pagina tiene traccia di tutti controlli che restituiscono true e richiama RaisePostDataChangedEvent su tali controlli. Gli eventuali eventi di modifica vengono generati da questo metodo. L'elaborazione dei dati di postback si articola dunque in due fasi, aggiornamento dello stato e generazione delle notifiche di modifica. Questa procedura evita che le notifiche di modifica vengano generate durante il caricamento dei dati di postback, quando potrebbero comportare una modifica dello stato non corretta prima che tutti i controlli abbiano la possibilità di caricare i dati di postback. Nella porzione di codice riportata di seguito viene illustrata un'implementazione di RaisePostDataChanged per un controllo casella di testo personalizzato.

public virtual void RaisePostDataChangedEvent() {
            OnTextChanged(EventArgs.Empty);      
      }
[Visual Basic]
Public Overridable Sub RaisePostDataChangedEvent()
   OnTextChanged(EventArgs.Empty)
End Sub

È importante che la logica di rendering assegni l'UniqueID all'attributo del nome del controllo. In caso contrario, il framework di pagina non sarà in grado di inviare i dati di postback al controllo. Se il controllo emette più elementi del form, è necessario che almeno uno degli elementi contenga un attributo del nome che corrisponde all'UniqueID del controllo. Per un esempio di un controllo personalizzato che crea più campi di form, vedere Composizione e rendering. Nel seguente frammento di codice UniqueID viene assegnato all'attributo del nome.

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

Per un esempio di un controllo casella di testo personalizzato che fa parte dell'elaborazione dei dati di postback, vedere Esempio di elaborazione dei dati di postback.

Vedere anche

Esempio di elaborazione dei dati di postback