Gestione dello stato in un controllo

Un controllo server ASP.NET eredita da Control una proprietà denominata ViewState che gli consente di partecipare facilmente alla gestione dello stato. Il tipo di ViewState è System.Web.UI.StateBag, ovvero un dizionario in cui sono archiviate le coppie nome/valore. ViewState viene mantenuto fisso in una variabile di stringa dal framework di pagina ASP.NET, inviato al client e restituito come variabile nascosta. Dopo il postback, il framework di pagina analizza la stringa di input della variabile nascosta e compila la proprietà ViewState di ogni controllo. Se un controllo utilizza ViewState per i dati della proprietà invece di un campo privato, la proprietà viene mantenuta fissa automaticamente nei percorsi di andata e ritorno al client. Se una proprietà non viene mantenuta fissa in ViewState, è consigliabile ripristinare il valore predefinito in fase di postback.

Il frammento di codice seguente mostra una proprietà salvata in ViewState.

public String Text {
          get {
              return (String) ViewState["Text"];
          }
          set {
              ViewState["Text"] = value;
          }
       }
[Visual Basic]
Public Property Text() As String
   Get
      Return CType(ViewState("Text"), String)
   End Get
   Set
      ViewState("Text") = value
   End Set
End Property

Per un esempio sull'utilizzo di ViewState per archiviare le proprietà, vedere Guida rapida di ASP.NET —> Web Form ASP.NET —> Modifica dei controlli personalizzati.

Nota   ViewState viene generalmente utilizzato per mantenere fissi i dati dei form in una pagina nei percorsi di andata e ritorno. Non utilizzare ViewState per archiviare informazioni come password, stringhe di connessione e percorsi dei file. Per ulteriori informazioni sulla condivisione dei dati nelle pagine o in un archivio più persistente, vedere Gestione dello stato ASP.NET.

Tipi che possono essere mantenuti fissi in ViewState

Un tipo serializzabile o che dispone di un TypeConverter appositamente definito può essere mantenuto fisso in ViewState. Tuttavia, i tipi solo serializzabili sono più lenti e generano un ViewState di dimensioni molto più grandi rispetto a quelli che dispongono di un TypeConverter. ViewState viene serializzato tramite un formato di serializzazione degli oggetti limitato ottimizzato per i tipi primitivi e per i tipi String, ArrayList e HashTable.

ViewState e prestazioni

Gli sviluppatori dei controlli devono tener presente che qualsiasi dato in ViewState esegue automaticamente un percorso di andata e ritorno al client. Poiché i percorsi di andata e ritorno contribuiscono all'overhead delle prestazioni, è importante utilizzare ViewState con cautela. Se sono presenti diverse proprietà che dipendono dai dati comuni, è possibile ottimizzare le prestazioni mantenendo fissi in ViewState solo gli elementi chiave. Un controllo eredita una proprietà denominata EnableViewState da Control che consente ai consumer del controllo di attivare o disattivare la persistenza di ViewState.

Personalizzazione del ripristino dello stato tramite ViewState

Per migliorare l'efficienza o per salvare un tipo personalizzato che non può essere archiviato per impostazione predefinita in ViewState, un controllo può personalizzare il modo in cui i dati delle proprietà vengono archiviati in ViewState. Se un controllo personalizza l'archiviazione dei dati di proprietà, deve, inoltre, offrire un'implementazione personalizzata per ripristinare i valori delle proprietà dai dati archiviati in ViewState. La classe base Control mette a disposizione due metodi per questo scopo, SaveViewState e LoadViewState. Le firme di tali metodi sono le seguenti.

protected virtual object SaveViewState();
protected virtual void LoadViewState(object savedState);
[Visual Basic]
Overridable Protected Function SaveViewState() As Object
Overridable Protected Sub LoadViewState(ByVal savedState As Object)

Per un esempio dell'esecuzione dell'override di SaveViewState e LoadViewState, vedere Esempio di controllo basato su template con associazione a dati.

Vedere anche

Gestione dello stato di ASP.NET | Stato sessione | Stato dell'applicazione