Prima dell'arrivo di ASP.NET, era usuale l'elaborazione degli input degli utenti, mediante 2 pagine. La prima pagina, era statica e conteneva un tag <form>
che inviava (tramite l'attributo action
) una serie di campi ad seconda pagina, dinamica, la quale si occupava di elaborare i valori inviati.
Una seconda tecnica era quella di avere il form in una pagina dinamica che inviava informazioni a se stessa. Nel form venivano usati dei campi nascosti (hidden) per passare alcune informazioni relative allo stato della pagina. Grazie a questo meccanismo si poteva capire se la pagina fosse stata richiesta per la prima volta o se avesse effettuato un post su se stessa, per poi agire di conseguenza. Questa tecnica è chiamata post back.
Il post back è implementato in ASP.NET in modo invisibile al programmatore attraverso il controllo server etichettato <form runat="server">
.
Listato 1. Dichiarazione di un controllo form
<form runat="server">
.... vari controlli ...
</form>
Questo equivale pressappoco a
Listato 2. Esempio di post back prima di ASP.NET
<form method=post action="nostra_pagina.aspx" runat="server">
.... vari controlli ...
<input type="hidden" name="isPostBack" value="true">
</form>
Il form server side è indispensabile per gestire i controlli server (dall'area di testo alla GridView)
si può omettere solo se non si prevede una interazione con la pagina.
L'attributo method
predefinito è post
e non get
come in HTML, ed i valori sono disponibili ogni volta nella collezione Request.Form
come in ASP.
Con la stessa tecnica viene mantenuto lo stato di alcuni controlli grazie alla variabile ViewState. Il ViewState
è una variabile stringa, il cui valore, come si può notare nell'esempio, è codificato e serve per ricostruire lo stato della pagina, in quanto le comunicazioni HTTP client-server sono prive di stato.
Se leggiamo il sorgente di una pagina generata da un web form, notiamo la presenza del ViewState
:
Listato 3. Generazione del ViewState
...
<body>
<form name="ctl00" method="post" action="orizzontale_b.aspx" id="ctl00">
<div>
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKLTc0MDEwNTM2MWRkrh4HGxooxoD8swfeDRec5C+Aedw=" />
</div>
...
La postback architecture ci da la possibilità di realizzare pagine HTML contenenti controlli con cui l'utente può interagire. I controlli scatenano eventi ed è compito dello sviluppatore realizzare gli opportuni gestori di eventi per gestire l'interazione.
Quando effettuiamo la richiesta di una web form, vengono sollevati gli eventi:
- Page_Init generato quando la pagina viene inizializzata
- Page_Load generato quando la pagina viene caricata
- Control Event generato se un comando (ad esempio un pulsante) ha inviato la pagina al server
- Page_Unload generato quando la pagina viene scaricata dalla memoria
La differenza tra il Page_Init
ed il Page_Load
è che nel Page_Init
il ViewState
non è stato ancora caricato, per cui i comandi mantengono i valori predefiniti anziché i valori impostati durante il postback.
Per gestire l'evento Page_Load
, si ricorre di frequente alla proprietà IsPostBack
della classe Page
. Se IsPostBack
è vera, ci troviamo in un contesto di postback, vale a dire che la pagina è stata caricata una prima volta ed è stata poi inviata al server in seguito al verificarsi di un evento sul client. Se IsPostBack
è falsa, la pagina è stata caricata per la prima volta.