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.