Tra le novità importanti introdotte nella tecnologia Microsoft.Net, vi è l'innovazione del ViewSpace. È contenuto all'interno dello spazio nomi (namespace) System.WEB.UI.StateBag ci consente di mantenere in modo automatico lo stato della pagina senza dover implementare tutta una serie di meccanismi (a volte molto complessi) per svolgere lo stesso lavoro con Active Server Page 3. Lo stato della pagina viene mantenuto se si eseguono richieste consecutive della stessa pagina. Nel caso venga richiesta una nuova pagina, il viewstate utilizzato verrà perso e sostituito da uno nuovo.
Ora, introduciamo l'argomento da un punto di vista soprattutto tecnico mostrando un breve listato scritto con l'intento di mostrare l'utilizzo del ViewState.
pagina mostraViewState.aspx
01: <%@ page language="vb"%>
02: <script runat="server">
03: sub page_load(obj as object, e as eventargs)
04: if not page.isPostBack then
05: viewstate("AltreInformazioni")="Informazioni aggiuntive immesse nel viewstate (" & now() & ")"
06: end if
07: end sub
08: sub preleva_informazioni(obj as object, e as eventargs)
09: lblValore.text = viewstate("AltreInformazioni") & "<br>" & lblValore.text
10: end sub
11: sub copia_nome(obj as object, e as eventargs)
12: lblValore.text = tbNome.text & "<br>" & lblValore.text
13: end sub
14: </script>
15: <html>
16: <head>
17: <title>Esempio del ViewState</title>
18: </head>
19: <body>
20: <form runat="server">
21: <asp:textbox id="tbNome" text="" runat="server" />
22: <br>
23: <asp:button id="btCopia" text="Copia il nome" onClick="copia_nome"
runat="server" />
24: <br>
25: <asp:button id="btPreleva" text="Preleva Informazioni dal ViewState" onClick="preleva_informazioni" runat="server" />
26: <br>
27: <asp:label id="lblValore" value="" runat="server" />
28: </form>
29: </body>
30: </html>
Come potete osservare, nella pagina sono presenti due sezioni di codice. La parte compresa tra la riga 01 e la riga 14 contengono elaborazioni da effettuare sul server. Le restanti righe, dalle 15 alla 30, saranno le righe che compongono ciò che vedremo a video dopo che il server avrà elaborato gli oggetti col tag runat="server". Com'è possibile osservare dal listato precedente, all'interno del form non è stato creato nessun campo denominato viewstate. Ora, utilizzo un bellissimo copia-incolla del listato html prodotto dopo l'esecuzione del listato appena proposto:
[i]Output HTML prodotto da mostraViewState.aspx[/i]
01: <html>
02: <head>
03: <title>Esempio del ViewState</title>
04: </head>
05: <body>
06: <form name="ctrl0" method="post" action="script.aspx" id="ctrl0">
07: <input type="hidden" name="__VIEWSTATE"
value="dDwtMTQ5MjM0ODgyMzt0PHA8bDxBbHRyZUluZm9yb
WF6aW9uaTs+O2w8SW5mb3JtYXppb25pIGFnZ2l1bnRpdmUga
W1tZXNzZSBuZWwgdmlld3N0YXRlICgxMC8wNy8yMDAyIDIxL
jM2LjI5KTs+Pjs7Pjs+" />
08:
09: <input name="tbNome" type="text" id="tbNome" />
10: <br>
11: <input type="submit" name="btCopia" value="Copia il nome" id="btCopia" />
12: <br>
13: <input type="submit" name="btPreleva" value="Preleva Informazioni dal ViewState" id="btPreleva" />
14: <br>
15: <span id="lblValore" value=""></span>
16: </form>
17: </body>
18: </html>
Come potete osservare, alla riga sette, compare un campo nascosto con un contenuto a noi completamente incomprensibile. Questo campo è il viewstate e le informazioni contenute al suo interno vengono mostrate criptate.
Ora, provo a fare cliccare il pulsante "copia nome" dopo aver scritto "Carratta Andrea" all'interno della textbox chiamata tbNome. Il ViewState è variato ed assume la seguente forma:
<input type="hidden" name="__VIEWSTATE" value="dDwtMTQ5MjM0ODgyMzt0PHA8bDxBbHRyZUluZm9ybWF6
aW9uaTs+O2w8SW5mb3JtYXppb25pIGFnZ2l1bnRpdmUgaW1tZXN
zZSBuZWwgdmlld3N0YXRlICgxMC8wNy8yMDAyIDIxLjM2LjI5KT
s+PjtsPGk8MT47PjtsPHQ8O2w8aTw3Pjs+O2w8dDxwPHA8bDxUZ
Xh0Oz47bDxDYXJyYXR0YSBBbmRyZWFcPGJyXD47Pj47Pjs7Pjs+
Pjs+Pjs+" />
ed il codice html che produce la label lblValore è variato in:
<span id="lblValore" value="">Carratta Andrea<br></span>
Ora, eseguiamo un bellissimo click sull'altro pulsante "Preleva Informazioni dal ViewState" e vediamo come varia il nostro viewstate:
<input type="hidden" name="__VIEWSTATE" value="dDwtMTQ5MjM0ODgyMzt0PHA8bDxBbHRyZUlu
Zm9ybWF6aW9uaTs+O2w8SW5mb3JtYXppb25pIGFnZ2l
1bnRpdmUgaW1tZXNzZSBuZWwgdmlld3N0YXRlICgxMC
8wNy8yMDAyIDIxLjM2LjI5KTs+PjtsPGk8MT47PjtsP
HQ8O2w8aTw3Pjs+O2w8dDxwPHA8bDxUZXh0Oz47bDxJ
bmZvcm1hemlvbmkgYWdnaXVudGl2ZSBpbW1lc3NlIG5
lbCB2aWV3c3RhdGUgKDEwLzA3LzIwMDIgMjEuMzYuMj
kpXDxiclw+Q2FycmF0dGEgQW5kcmVhXDxiclw+Oz4+O
z47Oz47Pj47Pj47Pg==" />
ed il codice necessario per mostrare a video la label:
<span id="lblValore" value="">Informazioni aggiuntive immesse nel viewstate (10/07/2002 21.36.29)<br>Carratta Andrea<br></span>
Ora viene spontanea una bella domanda:"ma le informazioni nel viewState,
come le metto?" Basta osservare la pagina mostraViewState.aspx(da riga 04
alla riga 06)
04: if not page.isPostBack then
05: viewstate("AltreInformazioni")="Informazioni aggiuntive immesse nel viewstate (" & now() & ")"
06: end if
Per render più semplice il concetto di memorizzazione nel viewState, pensiamo al viewState come "un array", dove andiamo a spercificare col nome della variabile il classico indice numerico.
Prima di concludere volevo indicare un paio di consigli sull'utilizzo del viewState:
- Il ViewState è estremamente comodo nella realizzazione di pagine asp.net, ma bisogna essere accorti nel non eccedere con la quantità di dati memorizzati al suo interno.
- È possibile disabilitare l'utilizzo del campo viewstate sia su tutta pagina che sul singolo oggetto e questo dipende dalla necessità dello sviluppatore. Per effettuare questo lavoro è necessario l'inserimento di EnableViewStat="false"
Ora, aggiungo il tag appena illustrato nel sorgente mostraViewState.aspx e
vediamo cosa accade.
pagina mostraViewState.aspx
01: <%@ page language="vb" EnableViewState="false" %>
02: <script runat="server">
03: sub page_load(obj as object, e as eventargs)
04: if not page.isPostBack then
05: viewstate("AltreInformazioni")="Informazioni aggiuntive immesse nel viewstate (" & now() & ")"
06: end if
07: end sub
08: sub preleva_informazioni(obj as object, e as eventargs)
09: lblValore.text = viewstate("AltreInformazioni") & "<br>" & lblValore.text
10: end sub
11: sub copia_nome(obj as object, e as eventargs)
12: lblValore.text = tbNome.text & "<br>" & lblValore.text
13: end sub
14: </script>
15: <html>
16: <head>
17: <title>Esempio del ViewState</title>
18: </head>
19: <body>
20: <form runat="server">
21: <asp:textbox id="tbNome" text="" runat="server"
/>
22: <br>
23: <asp:button id="btCopia" text="Copia il nome" onClick="copia_nome"
runat="server" />
24: <br>
25: <asp:button id="btPreleva" text="Preleva Informazioni dal
ViewState" onClick="preleva_informazioni" runat="server"
/>
26: <br>
27: <asp:label id="lblValore" value="" runat="server"
/>
28: </form>
29: </body>
30: </html>
Ed ora analizziamo il viewState proposto:
<input type="hidden" name="__VIEWSTATE" value="dDwtMTQ5MjM0ODgyMzs7Pg==" />
Com'è possibile osservare, questa volta il viewstate è molto
più corto e, facendo gli stessi test proposti prima, il viewstate non subirà nessuna modifica e il contenuto della label verrà svuotato di volta in volta in quanto il server non conosce il suo stato attuale ed il suo valore. viewState, che dire ... FENOMENALE!!!