Il protocollo HTTP consente la navigabilità in internet, quando il browser (il client) chiede di visualizzare una pagina ad un dato indirizzo, il web server risponde inviandogliela, questo meccanismo però è senza stato, ovvero tra la richiesta di una pagina web e le successive non vi è alcuna relazione o dipendenza, il server scarica la pagina sul client e libera tutte le risorse non tenendo alcuna informazione su di essa, si dice che il protocollo http è stateless.
Sin quando si tratta di visualizzare delle semplici pagine html contenenti soltanto foto e testo questo meccanismo và più che bene, anzi è particolarmente performante poichè non impegna la banda e le risorse del server, ma col crescere d'internet un sito web è diventato una vera applicazione web, dove mantenere le informazioni tra una richiesta e l'altra è un'esigenza fondamentale per implementare funzionalità più avanzate, ecco allora che il protocollo http con la sua natura stateless mostra tutta la sua limitazione.
Nell'evoluzione dei linguaggi orientati al web si sono trovate ed adottate diverse soluzioni per sopperire alla mancanza di stato di http, ed anche ASP.NET ovviamente implementa tutta una serie di meccanismi per la "Gestione dello Stato", troviamo: i campi hidden, i cookies, il ViewState, le Session, l'Application; tutti con i propri pregi e difetti, o meglio con le proprie caratteristiche per essere usati adeguatamente a seconda del contesto. Tra questi meccanismi di Gestione dello Stato, un'importanza particolare è rivestita dal ViewState, abilitato di default sui controlli e sulle pagine aspx, tramite esso è possibile recuperare lo stato di un controllo tra un post back e l'altro. Non sempre però il ViewState è utile, ci sono casi in cui non serve, e disabilitarlo allegerisce la pagina di un sovraccarico inutile, allora, quando e come disabilitare il ViewState?
Il meccanismo di persistenza delle informazioni tra un postback ed il successivo viene implementato di default in ASP.NET a mezzo del ViewState, tramite esso è possibile fare in modo che un qualsiasi controllo presente all'interno della pagina tenga memoria del suo stato precedente, una dropdown mantiene il valore selezionato, una checkbox resti spuntata, piuttosto che un button resti invisibile se la sua proprietà "Visible" era settata come "false". Quando viene effettuato un postback, ASP.NET percorre l'albero dei controlli conservando le loro informazioni nel ViewState come formato stringa, compressa in base 64 per risparmiare spazio e banda, dette informazioni vengono recuperate e re-impostate sui vari controlli prima di generare il codice html per restituire la pagina al client, ottenendo così l'effetto di persistere lo stato tra i postback.
Questo meccanismo impegna risorse, il server deve percorrere l'albero dei controlli, salvare e successivamente recuperare le informazioni; inoltre appesantisce la pagina a causa della stringa generata dal ViewState, che sebbene compressa, a seconda dell'uso massiccio o meno del ViewState può risultare particolarmente lunga. In un'ottica quindi di migliorare le performance ed ottimizzare le pagine, bisogna valutare se i controlli e la pagina devono far uso del ViewState o meno, disabilitandolo quando questo non serve.
Il ViewState può essere disabilitato a diversi livelli, a livello di singolo controllo, di pagina, o dell'intera applicazione web. Se una pagina presenta del puro testo, tenere abilitato il ViewState diventa superfluo, se invece al suo interno vi sono controlli che ne fanno uso e altri no, è opportuno disabilitarlo per singolo controllo; infine può essere disabilitato per l'intera applicazione web disattivando il ViewState dal web.config.
Ogni controllo asp.net possiede una proprietà di tipo booleano "EnableViewState", tramite essa è possibile settare il suo valore a "true" o "false" per abilitare o meno il ViewState. Anaolgo discorso vale a livello di pagina, anche la pagina aspx nella direttiva "@Page" possiede questa proprietà, settandola a false, automaticamente il ViewState verrà disabilitato sull'iitera pagina e sui controlli in essa presenti. Se invece vogliamo disabilitare il ViewState a livello globale in un sol colpo, dobbiamo andare ad agire sul web.config, basterà portarsi all'interno di system.web, al nodo pages, e settare la citata proprietà su false, in questo modo:
<pagesenableViewState="false">
Disabilitando il ViewState ottimizziamo le performance e riduciamo il peso della pagina (basta guardare il codice html della pagina generata per non vedere più l'incomprensibile stringa compressa in base 64 del ViewState), ricordiamo e valutiamo bene però di farlo solo quando necessario, disabilitare il ViewState dal web.config per l'intera applicazione web potrebbe comportare dei malfunzionamenti imprevisti proprio a causa di una valutazione non approfondita della Gestione dello stato di ogni singola pagina o controllo della nostra applicazione, meglio quindi testare e studiare per bene la persistenza dello stato di ogni singola pagina, e disabilitare il ViewState soltanto dove è realmente superfluo.
Come sempre, lo spazio dei commenti è a vostra disposizione per porre qualsiasi domanda e dire la vostra sull'abilitazione o meno del ViewState in ASP.NET