Un classico problema delle applicazioni AJAX è mantenere la consistenza della navigazione quando si utilizzano i controlli ("Avanti" e "Indietro") del browser. Chi sviluppa applicazioni Web AJAX-enabled, sicuramente si è accorto di come spesso l'utilizzo del pulsante "Indietro" del browser ad esempio possa provocare una navigazione verso un contenuto o una pagina non desiderata. Il problema è ancor più evidente se vengono generati diversi postback asincroni all'interno della stessa pagina.
Ebbene, se precedentemente dovevamo trovare soluzioni ad hoc più o meno eleganti a questo tipo di anomalia funzionale, ora abbiamo il controllo History, che rende la programmabilità della navigazione logica delle nostre applicazioni AJAX-enabled molto più naturale ed intuitiva.
Questo server control (attualmente nel namespace Microsoft.Web.Preview.UI.Controls) ha infatti lo scopo di permettere la gestione lato server delle informazioni di stato riguardanti la navigazione (chiamate "history point"), che possono dunque essere sfruttate per ricreare il contenuto corretto della pagina ad ogni interazione dell'utente con il browser. E' inoltre degno di nota l'interfacciamento con l' history-stack del browser: ce ne accorgiamo dando una rapida occhiata al javascript che il controllo genera in fase di rendering ;).
Nello specifico, il funzionamento del controllo prevede che l'invio di ciascuna richiesta di navigazione scateni l'evento Navigate, all'interno del quale possiamo controllare sia URL che history points, al fine di rendere semplice la ricostruzione dello stato "cronologicamente" corretto della nostra pagina.
Il suo utilizzo è veramente banale: supponiamo che nel nostro UpdatePanel sia inserito un Button che genera un AsyncPostback, tramite cui possiamo aggiungere un nuovo "history point". Nella nostra pagina basterà inserire il seguente markup:
...
<asp:History runat="server" ID="PageHistory1" OnNavigate="OnNavigateEvent" />
<asp:Button ID="TestButt" runat="server" Text="Aggiungi nuovo HistoryPoint" OnClick="MyButtonClick" />
...
mentre nel codebehind...
public void OnNavigateEvent(object sender, HistoryEventArgs args)
{
if (args.State["MyState"] != null)
{
// viene recuperato lo stato per la corretta ricostruzione
// del contenuto della pagina
string pageStateValue = args.State["MyState"].ToString();
}
}
public void MyButtonClick(object sender, EventArgs args)
{
// Aggiunta di un nuovo HistoryPoint...
PageHistory1.AddHistoryPoint("MyState", "myData....");
}
Notiamo immediatamente come tutto ruoti intorno all'oggetto State (che è di tipo Dictionary<string,object>), in cui possiamo inserire i nostri HistoryPoint organizzandoli eventualmente per categoria (in base alle key che impostiamo nel Dictionary).
Un' ultima ma fondamentale considerazione riguarda la sicurezza: nonostante ogni informazione di stato possa essere codificata e/o criptata, il controllo History (come il ViewState) va considerato come un qualunque controllo sfruttabile per inviare dati 'maliziosi' al server, quindi potenzialmente non sicuro. Insomma, finché possibile, meglio evitare la memorizzazione di dati sensibili nei nostri HistoryPoint!!!
Technorati tags:
ASP.NET,
Ajax