asp - asp.net - aspcode.it

COMMUNITY - Login
 Username:
 
 Password:
 
Voglio registrarmi!
Password dimenticata?
 Utenti on-line: 0
 Ospiti on-line: 5970
ASPCode.it - Store

  > > Articoli

Come utilizzare il ViewState

Data di pubblicazione: 29/09/2003        Voto della community: 3,43 (Votanti: 7)


Il ViewState rappresenta una soluzione per scrivere meno codice all'interno dei Form, in questo articolo scopriamo i vantaggi del suo utilizzo.

Il ViewState è la tecnica utilizzata da ASP.NET per tenere traccia, attraverso un campo nascosto nel Form, dello stato di un controllo: quando una pagina ed il relativo Form vengono eseguiti, i valori di tutti i controlli sono codificati all’interno un’unica stringa memorizzata in un campo nascosto chiamato “__VIEWSTATE”. Questa soluzione consente di trasferire la gestione dello stato dei controlli dal Server al Client; solo quando il Client effettuerà il PostBack della pagina al Server, attraverso il ViewState, verranno ripristinate tutte le impostazioni delle informazioni presenti nella pagina (il passaggio di valori tra Client e Server viene detto Server RoundTrip).

Esempio di ViewState:

<input type="hidden" name="__VIEWSTATE" value="dDwxNDg5OTk5MzM7Oz7DblWpxMjE3ATl4Jx621QnCmJ2VQ==" />

Tutte le pagine ASP.NET sono un’istanza della classe Page, dalla quale vengono ereditati molti eventi, il più utilizzato è l’evento Page_Load, che si verifica ad ogni caricamento della pagina; per PostBack si intende il caricamento della stessa pagina in seguito all’esecuzione di un Form.
All’interno del Page_Load è possibile quindi verificare se è stato effettuato il primo accesso alla pagina, utilizzando la proprietà:

page.isPostBack

La proprietà IsPostBack dell’oggetto Page, restituisce il valore "true" solo quando il Form presente nella pagina è stato eseguito e "false" quando si tratta del primo accesso alla pagina. Il Postback consente quindi di simulare il concetto di stato dei campi presenti in un Form.

Possiamo quindi descrivere meglio il ViewState come il meccanismo in base al quale lo stato di una pagina viene memorizzato durante la fase di PostBack; lo stato è mantenuto solo se vengono eseguite richieste consecutive della stessa pagina, nel caso in cui venga caricata una nuova pagina il ViewState verrà perso.

L’unico svantaggio nell’utilizzo del ViewState è dato dalla dimensione della pagina, che cresce notevolmente al crescere del numero di controlli presenti nel Form.
Per default il ViewState viene attivato in tutte le pagine, ma è possibile disattivarlo impostando la proprietà EnableViewState di ogni singolo controllo a "false", oppure disabilitando la gestione direttamente su tutta la pagina o a livello di applicazione.

E’ possibile disabilitare il ViewState:
  • per controllo (nel tag) <asp:datagrid EnableViewState="false" … />
  • per pagina (nella direttiva) <%@ Page EnableViewState="False" … %>
  • per l'intera applicazione (nel web.config) <Pages EnableViewState="false" … />
E’ sempre buona norma disabilitare il ViewState quando non viene utilizzato (ad esempio quando non è presente un PostBack della pagina a se stessa).

ASP.NET consente di salvare direttamente un valore nel ViewState, utilizzando:

ViewState(key) = value

oppure leggere un valore salvato:

Value = ViewState(key)

In molti casi il ViewState potrà sostituire le vecchie Session( ), ma esistono ancora alcune situazioni in cui le variabili di Sessioni risultano essenziali:
  • quando vi è una grande quantità di dati da gestire, al fine di evitare che la dimensione della pagina aumenti troppo (payload HTML)
  • quando si richiede una maggiore sicurezza dei dati trasmessi al Client: i dati memorizzati nel ViewState posso essere facilmente decodificati; al contrario, le variabili di Sessione, garantiscono una maggiore sicurezza.
Visualizzando il ViewState all’interno di una pagina HTML è facile pensare che la stringa sia crittografata, ma si tratta di una semplice codifica in Base 64; è possibile comunque attivare due livelli di protezione al ViewState:

A prova di alterazione: viene utilizzato un codice hash che consente di ridurre le probabilità di spoofing sull’applicazione.

Impostazione dell’attributo EnableViewStateMAC nella pagina:

<%@Page EnableViewStateMAC=true %>

Crittografica: tutte le informazioni vengono crittografate utilizzando l’algoritmo simmetrico Triple DES.

Impostazione dell’attributo EnableViewStateMAC nella pagina:

<%@Page EnableViewStateMAC=true %>

Impostazione del tipo di convalida machineKey a 3DES nel machine.config:

<machineKey validation="3DES" />

In ogni caso è importante ricordare che, maggiore sarà il livello di protezione adottato, maggiore sarà il tempo di elaborazione della pagina quindi, anche in questo caso, è necessario utilizzare il ViewState con la dovuta cautela, ponderando sempre ogni singola scelta.

Approfondimenti

Esempio sull'utilizzo della proprietà IsPostBack all'interno del Page_Load:

<%@Page Language="VB"%>
<script language="vb" runat="server">

Sub Page_Load(sender as Object, e as EventArgs)
  ' Visualizza il contenuto dell' input box se presente un valore
  if Page.IsPostBack then
    risposta.innerHTML = "Piacere di conoscerti " + txtNome.value
  else
    risposta.innerHTML = ""
  end if
End Sub

</script>


<html>
  <head>
    <title>Esempio sul Page_Load</title>
  </head>
  <body>
    <form runat="server">
      <table align="center">
        <tr>
          <td>
            Inserisci il tuo nome:
          </td>
          <td>
            <input type="text" id="txtNome" name="txtNome" size="20" runat="server">
          </td>
        </tr>
        <tr>
          <td colspan="2" align="right">
            <input type="submit" id="btnSubmit" value="Invia">
          </td>
        </tr>
      </table>
     <div class="risposta" id="risposta" runat="server">
    </div>
  </form>
</body>
</html>

Primo accesso alla pagina
Fig.1. Primo accesso alla pagina.

Primo accesso alla pagina
Fig.2. Fase di PostBack: l'utente ha inserito il nome e viene visualizzato il messaggio di saluto.


Si ringrazia DotNetIt.com per la gentile concessione dell'articolo.




Utenti connessi: 5970