Condividi tramite


Cenni preliminari sullo stato di visualizzazione ASP.NET

Aggiornamento: novembre 2007

Lo stato di visualizzazione è il metodo utilizzato dal framework delle pagine ASP.NET per mantenere i valori delle pagine e dei controlli tra i vari round trip. Quando viene eseguito il rendering del markup HTML, lo stato corrente della pagina e i valori da mantenere durante il postback vengono serializzati in stringhe codificate in base 64. Queste informazioni vengono quindi inserite nei campi nascosti dello stato di visualizzazione.

Vengono illustrati i seguenti argomenti:

  • Scenari

  • Funzionalità ViewState

  • Informazioni di supporto

  • Riferimento alle classi

  • Risorse supplementari

  • Novità

Scenari

Lo stato di visualizzazione viene utilizzato automaticamente dal framework delle pagine ASP.NET per conservare le informazioni che devono essere mantenute tra i vari postback. Queste informazioni includono i valori non predefiniti dei controlli.

È anche possibile utilizzare lo stato di visualizzazione per archiviare i dati dell'applicazione specifici di una pagina.

Torna all'inizio

Funzionalità

Lo stato di visualizzazione è un repository all'interno di una pagina ASP.NET in cui è possibile archiviare i valori da mantenere durante il postback. Il framework di pagine utilizza lo stato di visualizzazione per mantenere le impostazioni di controllo tra i vari postback.

Lo stato di visualizzazione può essere utilizzato nelle applicazioni per eseguire quanto segue:

  • Mantenere i valori tra i vari postback senza archiviarli nello stato sessione o in un profilo utente.

  • Archiviare i valori delle proprietà della pagina o del controllo definiti.

  • Creare un provider dello stato di visualizzazione personalizzato che consente di archiviare le informazioni sullo stato di visualizzazione in un database SQL Server o in un altro archivio dati.

Ad esempio, è possibile archiviare le informazioni nello stato di visualizzazione accessibile dal codice durante l'evento di caricamento della pagina al successivo invio della pagina al server. Per consigli sull'utilizzo, vedere Suggerimenti per la gestione dello stato di ASP.NET.

Torna all'inizio

Informazioni di supporto

Un'applicazione Web è priva di informazioni sullo stato. A ogni richiesta della pagina Web da parte del server viene creata una nuova istanza della classe della pagina. Di norma, questo significa che tutte le informazioni contenute nella pagina e nei relativi controlli vengono perse a ogni round trip. Ad esempio, per impostazione predefinita, se un utente immette informazioni in una casella di testo di una pagina Web HTML, tali informazioni vengono inviate al server. Tuttavia, non vengono restituite al browser nella risposta.

Per superare questo limite intrinseco della programmazione Web, nel framework delle pagine ASP.NET sono disponibili diverse funzionalità di gestione dello stato che consentono di mantenere i valori di pagine e controlli tra i vari round trip al server Web. Una di queste funzionalità è lo stato di visualizzazioneCenni preliminari sulla gestione dello stato ASP.NET.

Per impostazione predefinita, il framework delle pagine ASP.NET utilizza lo stato di visualizzazione per mantenere i valori delle pagine e dei controlli tra i vari round trip. Quando viene eseguito il rendering del markup HTML, lo stato corrente della pagina e i valori da mantenere durante il postback vengono serializzati in stringhe codificate in base 64. Vengono quindi inseriti in campi nascosti nella pagina.

È possibile accedere allo stato di visualizzazione nel codice utilizzando la proprietà ViewState della pagina. La proprietà ViewState è un dizionario di coppie chiave/valore contenenti i dati dello stato di visualizzazione.

Nota sulla sicurezza:

Il contenuto di un campo nascosto può essere facilmente visualizzato e modificato da un utente malintenzionato. Per ulteriori informazioni sulla protezione dei dati dello stato di visualizzazione, vedere Protezione dello stato di visualizzazione più avanti in questo argomento.

Per consigli su quando è opportuno memorizzare le informazioni nello stato di visualizzazione, vedere Suggerimenti per la gestione dello stato di ASP.NET.

Per modificare il comportamento predefinito e memorizzare lo stato di visualizzazione in un'altra posizione, ad esempio un database SQL Server, implementare una classe PageStatePersister personalizzata per archiviare i dati della pagina. Per un esempio di archiviazione dello stato della pagina in un flusso anziché in un campo nascosto, vedere l'esempio fornito per la classe PageStatePersister.

Considerazioni sull'utilizzo dello stato di visualizzazione

Lo stato di visualizzazione fornisce informazioni sullo stato relative a una pagina ASP.NET specifica. Per utilizzare le informazioni su più pagine o mantenere le informazioni tra una visita al sito Web e l'altra, è necessario utilizzare un metodo diverso di gestione dello stato, ad esempio lo stato dell'applicazione, lo stato sessione o le proprietà del profilo.

Poiché le informazioni sullo stato di visualizzazione vengono serializzate in XML e codificate in base 64, è possibile che venga generata una grande quantità di dati. Quando la pagina viene inserita nel server, il contenuto dello stato di visualizzazione viene inviato come parte delle informazioni di postback della pagina. Se lo stato di visualizzazione contiene una quantità elevata di dati, le prestazioni della pagina potrebbero risentirne. Verificare le prestazioni delle pagine utilizzando dati tipici per l'applicazione, al fine di determinare se la dimensione dello stato di visualizzazione causa problemi di prestazioni. Per metodi alternativi allo stato di visualizzazione, vedere Suggerimenti per la gestione dello stato di ASP.NET.

Se non è necessario archiviare le informazioni sui singoli controlli, è possibile disattivare lo stato di visualizzazione per un controllo. Se un controllo in una pagina viene aggiornato dall'archivio dati a ogni postback, è possibile disattivare lo stato di visualizzazione per tale controllo al fine di ridurne la dimensione. Ad esempio, è possibile disattivare lo stato di visualizzazione per un controllo quale GridView.

Nota:

Anche se si disattiva lo stato di visualizzazione in modo esplicito, viene comunque inviato un campo nascosto al browser per indicare che è in corso il postback per la pagina.

Un'altra considerazione riguarda il fatto che, se la quantità di dati in un campo nascosto diventa eccessiva, alcuni proxy e firewall impediranno l'accesso alla pagina contenente tali dati. Poiché la quantità massima consentita può variare in base all'implementazione di firewall e proxy differenti, i campi nascosti di grandi dimensioni possono causare problemi saltuari. Se la quantità di dati archiviati nella proprietà ViewState supera il valore specificato nella proprietà MaxPageStateFieldLength della pagina, questa suddivide lo stato di visualizzazione in più campi nascosti. Così facendo la dimensione dei singoli campi nascosti sarà inferiore alla dimensione rifiutata dai firewall.

Alcuni dispositivi mobili non consentono l'impiego di campi nascosti e non supportano perciò l'utilizzo dello stato di visualizzazione. Per ulteriori informazioni e alternative, vedere Cenni preliminari sullo sviluppo di pagine Web mobili ASP.NET.

Stato del controllo

Oltre allo stato di visualizzazione, ASP.NET supporta lo stato del controllo. La pagina utilizza lo stato del controllo per le informazioni sul controllo che devono essere mantenute tra i vari postback, anche se lo stato di visualizzazione è disattivato per la pagina o un controllo. Come lo stato di visualizzazione, lo stato del controllo viene archiviato in uno o più campi nascosti.

Salvataggio dei valori nello stato di visualizzazione

È possibile accedere alle informazioni sullo stato di visualizzazione mediante la proprietà ViewState della pagina, la quale espone un oggetto dizionario. È possibile utilizzare questo dizionario per archiviare valori personalizzati. Un utilizzo tipico prevede l'archiviazione del valore di proprietà personalizzate definite nella pagina.

Poiché lo stato di visualizzazione viene inviato come campo nascosto, è possibile apportarvi modifiche fino al verificarsi dell'evento PreRenderComplete della pagina. Una volta eseguito il rendering della pagina nel browser, le modifiche allo stato di visualizzazione non verranno più salvate.

Le informazioni nel campo dello stato di visualizzazione nascosto possono essere viste dagli utenti in grado di visualizzare l'origine della pagina Web e decodificare stringhe codificate in base 64. Questo comporta un potenziale problema di sicurezza. Per ulteriori informazioni sui problemi di sicurezza con lo stato di visualizzazione, vedere Protezione dello stato di visualizzazione più avanti in questo argomento.

Nota:

Per utilizzare la proprietà ViewState, la pagina Web ASP.NET deve possedere un elemento form con l'attributo .

Per salvare un valore nello stato di visualizzazione, creare un nuovo elemento contenente il valore da salvare e aggiungerlo al dizionario dello stato di visualizzazione. Nell'esempio riportato di seguito viene illustrata una pagina Web ASP.NET con il codice che consente di salvare una stringa e un valore intero nello stato di visualizzazione.

<%@ Page Language="VB" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script >
  ' Sample ArrayList for the page.
  Dim PageArrayList As ArrayList

  Function CreateArray() As ArrayList
    ' Create a sample ArrayList.
    Dim result As ArrayList
    result = New ArrayList(4)
    result.Add("item 1")
    result.Add("item 2")
    result.Add("item 3")
    result.Add("item 4")
    Return result
  End Function

  Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
    If (Me.ViewState("arrayListInViewState") IsNot Nothing) Then
      PageArrayList = CType(Me.ViewState("arrayListInViewState"), ArrayList)
    Else
      ' ArrayList isn't in view state, so it must be created and populated.
      PageArrayList = CreateArray()
    End If
    ' Code that uses PageArrayList.
  End Sub

  Sub Page_PreRender(ByVal sender As Object, ByVal e As EventArgs)
    ' Save PageArrayList before the page is rendered.
    Me.ViewState.Add("arrayListInViewState", PageArrayList)
  End Sub
</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head >
    <title>View state sample</title>
</head>
<body>
    <form id="form1" >
    <div>
    </div>
    </form>
</body>
</html>

<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script >
  // Sample ArrayList for the page.
  ArrayList PageArrayList;

  ArrayList CreateArray()
  {
    // Create a sample ArrayList.
    ArrayList result = new ArrayList(4);
    result.Add("item 1");
    result.Add("item 2");
    result.Add("item 3");
    result.Add("item 4");
    return result;
  }

  void Page_Load(object sender, EventArgs e)
  {
    if (ViewState["arrayListInViewState"] != null)
    {
      PageArrayList = (ArrayList)ViewState["arrayListInViewState"];
    }
    else
    {
      // ArrayList isn't in view state, so it must be created and populated.
      PageArrayList = CreateArray();
    }
    // Code that uses PageArrayList.
  }
    
  void Page_PreRender(object sender, EventArgs e)
  {
    // Save PageArrayList before the page is rendered.
    ViewState.Add("arrayListInViewState", PageArrayList);
  }
</script>

<html xmlns="http://www.w3.org/1999/xhtml" >
<head >
    <title>View state sample</title>
</head>
<body>
    <form id="form1" >
    <div>
    </div>
    </form>
</body>
</html>

Tipi di dati che è possibile memorizzare nello stato di visualizzazione

Nello stato di visualizzazione è possibile memorizzare i seguenti tipi di oggetti:

  • Stringhe

  • Integer

  • Valori Boolean

  • Oggetti Array

  • Oggetti ArrayList

  • Tabelle Hash

  • Convertitori di tipi personalizzati (vedere la classe TypeConverter per ulteriori informazioni)

È anche possibile archiviare altri tipi di dati, ma la classe deve essere compilata con l'attributo Serializable affinché i valori possano essere serializzati per lo stato di visualizzazione.

Lettura di dati dallo stato di visualizzazione

Per leggere un valore dallo stato di visualizzazione, ottenere la proprietà ViewState della pagina, quindi leggere il valore dal dizionario dello stato di visualizzazione.

Nell'esempio riportato di seguito viene illustrato come ottenere un oggetto ArrayList denominato arrayListInViewState dallo stato di visualizzazione e associarvi un controllo GridView come origine dati.

Dim arrayList As ArrayList
arrayList = CType(ViewState("arrayListInViewState"), ArrayList)

Me.GridView1.DataSource = arrayList
Me.GridView1.DataBind()

arrayList = new ArrayList();
arrayList = (ArrayList)ViewState["arrayListInViewState"];

this.GridView1.DataSource = arrayList;
this.GridView1.DataBind();

I valori nello stato di visualizzazione sono tipizzati come String. Se in Visual Basic si imposta Option Strict On, è necessario eseguire il cast dei valori dello stato di visualizzazione nel tipo appropriato prima di utilizzarli, come illustrato nell'esempio precedente. In C#, è sempre necessario eseguire il cast nel tipo appropriato quando si leggono i valori dello stato di visualizzazione.

Se si tenta di ottenere un valore inesistente dallo stato di visualizzazione, non viene generata alcuna eccezione. Per accertarsi della presenza di un valore nello stato di visualizzazione, verificare innanzitutto l'esistenza dell'oggetto. Nell'esempio riportato di seguito viene illustrato come verificare una voce dello stato di visualizzazione.

If ViewState("color") Is Nothing Then
    ' No such value in view state, take appropriate action.
End If
if (ViewState["color"] == null)
    // No such value in view state, take appropriate action.

Se di tenta di utilizzare una voce dello stato di visualizzazione inesistente in altro modo, ad esempio per verificarne il tipo, viene generata un'eccezione NullReferenceException.

Torna all'inizio

Protezione dello stato di visualizzazione

Per impostazione predefinita, i dati dello stato di visualizzazione vengono archiviati nella pagina in un campo nascosto e codificati in base 64. Viene inoltre creato un hash dai dati mediante una chiave MAC (Machine Authentication Code). Il valore hash viene aggiunto ai dati dello stato di visualizzazione codificati e la stringa ottenuta viene archiviata nella pagina. Quando la pagina viene reinserita nel server, il framework delle pagine ASP.NET calcola nuovamente il valore hash e lo confronta con il valore archiviato nello stato di visualizzazione. Se i valori hash non corrispondono viene generata un'eccezione che indica che i dati dello stato di visualizzazione potrebbero non essere validi.

Creando un valore hash, il framework delle pagine ASP.NET può verificare se i dati dello stato di visualizzazione sono stati danneggiati o alterati. Tuttavia, anche se non vengono alterati, i dati possono comunque essere intercettati e letti da utenti malintenzionati.

Utilizzo della chiave MAC per il calcolo del valore hash dello stato di visualizzazione

La chiave MAC utilizzata per calcolare il valore hash dello stato di visualizzazione viene generata automaticamente oppure specificata nel file Machine.config. In caso di generazione automatica, la chiave viene creata in base all'indirizzo MAC del computer, ovvero il valore GUID univoco della scheda di rete in quel computer.

Gli utenti malintenzionati possono incontrare delle difficoltà nel decodificare la chiave MAC in base al valore hash nello stato di visualizzazione. Pertanto la codifica MAC è generalmente un modo affidabile per determinare se i dati dello stato di visualizzazione sono stati modificati.

In generale quanto più grande è la chiave MAC utilizzata per generare l'hash, minori sono le probabilità che stringhe diverse presentino lo stesso valore hash. Quando la chiave viene generata automaticamente, ASP.NET utilizza la codifica SHA-1 per creare una chiave di grandi dimensioni. Tuttavia, in un ambiente Web farm è necessario che la chiave sia la stessa in tutti i server. In caso contrario, se la pagina viene rinviata a un server diverso da quello che ha creato la pagina, il framework di pagina ASP.NET genererà un'eccezione. Di conseguenza, in un ambiente Web farm, è consigliabile specificare una chiave nel file Machine.config anziché fare in modo che venga generata automaticamente da ASP.NET. In tal caso, accertarsi di creare una chiave abbastanza lunga da fornire sufficiente sicurezza al valore per cui è stato generato un hash. Più la chiave è lunga, tuttavia, più tempo occorrerà per creare un hash. È pertanto necessario valutare se sia più importante la sicurezza o piuttosto le prestazioni.

Crittografia dello stato di visualizzazione

La codifica MAC contribuisce a impedire l'alterazione dei dati dello stato di visualizzazione, tuttavia non ne impedisce la visualizzazione da parte degli utenti. È possibile impedire la visualizzazione dei dati in due modi: trasmettendo la pagina tramite SSL e crittografando i dati dello stato di visualizzazione. Richiedendo l'invio della pagina tramite SSL, è possibile impedire lo sniffing dei pacchetti di dati e l'accesso non autorizzato ai dati da parte di utenti diversi dai destinatari previsti della pagina.

Tuttavia l'utente che ha richiesto la pagina può ancora visualizzare i dati dello stato di visualizzazione in quanto la pagina viene sottoposta a decrittografia SSL per consentirne la visualizzazione nel browser. Se non sussistono questioni circa utenti autorizzati che hanno accesso ai dati dello stato di visualizzazione, non vi è alcun problema. In alcuni casi, tuttavia, è possibile che i controlli utilizzino lo stato di visualizzazione per archiviare informazioni strettamente riservate. La pagina, ad esempio, potrebbe contenere un controllo con associazione a dati in cui sono memorizzati identificatori di elementi (chiavi di dati) nello stato di visualizzazione. Se questi identificatori contengono dati sensibili, ad esempio gli ID cliente, è consigliabile crittografare i dati dello stato di visualizzazione in aggiunta o in alternativa all'invio della pagina tramite SSL.

Per crittografare i dati, impostare la proprietà ViewStateEncryptionMode della pagina su true. Se le informazioni vengono archiviate nello stato di visualizzazione, è possibile utilizzare le normali tecniche di lettura e scrittura; la pagina gestisce automaticamente la crittografia e la decrittografia. La crittografia dei dati dello stato di visualizzazione può influire sulle prestazioni dell'applicazione. Si consiglia pertanto di non utilizzarla, eccetto nei casi di assoluta necessità.

Crittografia dello stato del controllo

I controlli che utilizzano lo stato del controllo possono richiedere che lo stato di visualizzazione venga crittografato attraverso la chiamata del metodo RegisterRequiresViewStateEncryption. Se un controllo nella pagina richiede la crittografia dello stato di visualizzazione, l'intero stato nella pagina verrà crittografato.

Codifica dello stato di visualizzazione per utente

Se un sito Web prevede l'autenticazione degli utenti, è possibile impostare la proprietà ViewStateUserKey nel gestore eventi Page_Init per l'associazione dello stato di visualizzazione della pagina a un utente specifico. Questo contribuisce a impedire gli attacchi tramite clic singolo con cui un utente malintenzionato crea una pagina Web valida e precompilata utilizzando lo stato di visualizzazione di una pagina creata in precedenza. L'autore dell'attacco induce quindi un utente a fare clic su un collegamento che invia la pagina al server utilizzando l'identità della vittima.

Quando viene impostata la proprietà ViewStateUserKey, l'identità dell'autore dell'attacco viene utilizzata per creare l'hash dello stato di visualizzazione della pagina originale. Quando la vittima viene invitata in modo ingannevole a inviare nuovamente la pagina, i valori hash saranno diversi in quanto le chiavi utente sono diverse. La pagina non supererà la verifica e verrà generata un'eccezione.

È necessario associare la proprietà ViewStateUserKey a un valore univoco per ciascun utente, ad esempio il nome utente o l'identificatore.

Protezione della configurazione in un ambiente host condiviso

In un ambiente host condiviso, utenti malintenzionati possono modificare le proprietà di gestione dello stato in grado di influenzare altre applicazioni sul computer. Questo può avvenire tramite modifica diretta del file Machine.config, tramite modifica per mezzo delle classi di configurazione e tramite altri strumenti di configurazione e amministrazione. È possibile impedire la modifica della configurazione delle applicazioni mediante la crittografia delle sezioni dei file di configurazione. Per ulteriori informazioni, vedere Crittografia delle informazioni di configurazione utilizzando la configurazione protetta.

Riferimento alle classi

ViewState

Fornisce un oggetto dizionario per il mantenimento dei valori tra le varie richieste per la stessa pagina.

PageStatePersister

Fornisce un mezzo per definire un meccanismo di archiviazione personalizzato per le informazioni sullo stato di visualizzazione, ad esempio in un database SQL Server.

Torna all'inizio

Vedere anche

Concetti

Cenni preliminari sulla gestione dello stato ASP.NET

Suggerimenti per la gestione dello stato di ASP.NET

Riferimenti

Torna all'inizio