ASP.NET 3.5 SP1 introduce un enanchement del controllo ScriptManager che permette di gestire degli stati di navigazione all'interno di una pagina AJAX-enabled accedibili mediante i pulsanti standard "Avanti/Indietro" del browser. In due parole: "Ajax History". Questa funzionalità fu inizialmente introdotta nel vecchio "ASP.NET Futures" mediante il controllo History (in passato scrissi anche un post a riguardo).
La questione è tutt'altro che banale: poiché un browser attiva i meccanismi di navigazione in base al cambio dell' URL, in caso di richieste AJAX che non redirigono verso URL diverse, il browser non aggiorna l' history cache, precludendo all'utente il corretto utilizzo dei pulsanti di navigazione per i diversi stati che desidereremmo impostare nella nostre pagine AJAX-enabled.
La gestione dell' AJAX History non è abilitata di default, tuttavia è molto semplice da implementare. L'unico problema è stabilire che tipo di implementazione ha senso in base alla user experience che si vuole ottenere ed in base al comportamento dei controlli AJAX che si trovano nella nostra pagina.
Partiamo da un classico esempio: Database Northwind, visualizzazione di Products in una GridView ed una DropDownList con AutoPostBack="True" che filtra i Products in base alla Category selezionata. Il tutto piazzato dentro un UpdatePanel.
Senza la gestione dell'history, ogni volta che selezioniamo un Item della DropDownList i dati nella GridView vengono sì aggiornati correttamente, ma se volessimo tenere traccia delle nostre selezioni come stati diversi (navigabili tramite i pulsanti standard "Avanti/Indietro" del browser) dovremmo gestire degli history point, che inoltre ci permettono di rendere eventualmente "bookmarkabili" i vari stati memorizzati, proprio come se fossero pagine diverse. Vediamo come:
1. Impostare EnableHistory="true" nello ScriptManager
<asp:ScriptManager ID="scriptManager_Main" runat="server" EnableHistory="true"
EnableSecureHistoryState="true|false" OnNavigate="scriptManager_Main_Navigate">
L'evento OnNavigate viene scatenato quando viene premuto un pulsante di navigazione del browser, mentre la proprietà EnableSecureHistoryState ci permette di cifrare o meno l'URL associata ad ogni HistoryPoint. Di queste cose ne parliamo tra pochissimo.
2. Gestire il salvataggio degli History point
In uno scenario come quello di esempio, quando selezioniamo una categoria nella DropDownList (evento SelectedIndexChanged), decidiamo si salvare un nuovo history point, poichè di fatto rappresenta uno stato "isolabile" in cui si trova la pagina.
// Creazione di un History Point se:
// 1. Il PostBack avviene in modalità PartialRendering
// 2. Non si stanno utilizzando i pulsanti di navigazione del browser
// 3. E' selezionato un valore non blank della DropDownList
protected void ddlProductsCategories_SelectedIndexChanged(object sender, EventArgs e)
{
if (scriptManager_Main.IsInAsyncPostBack && !scriptManager_Main.IsNavigating
&& ddlProductsCategories.SelectedIndex > 0)
{
scriptManager_Main.AddHistoryPoint("category", ddlProductsCategories.SelectedIndex.ToString(), this.Title);
}
}
In questo caso notiamo come l'overload utilizzato del metodo AddHistoryPoint permetta di associare al nuovo HistoryPoint un titolo, che possiamo usare eventualmente come titolo della pagina.
3. Gestire dell'evento Navigate dello ScriptManager
Grazie a questo evento possiamo impostare uno degli stati salvati grazie alla proprietà State dell' HistoryEventArgs, inizializzata automaticamente da ASP.NET grazie al parsing della querystring.
protected void scriptManager_Main_Navigate(object sender, HistoryEventArgs e)
{
string categoryID = e.State["category"];
if (string.IsNullOrEmpty(categoryID)) ddlProductsCategories.SelectedIndex = 0;
else ddlProductsCategories.SelectedIndex = Convert.ToInt32(categoryID);
updatePanel_Products.Update();
}
4. Gestione della proprietà EnableSecureHistoryState dello ScriptManager
Quando un utente memorizza un nuovo HistoryPoint, automaticamente ASP.NET genera un'unica URL manipolando la querystring, che il browser salva opportunamente in modo tale da renderla navigabile:
A questo punto la proprietà EnableSecureHistoryState ci permette di stabilire in via definitiva se l'URL oggetto dell'HistoryPoint possa o meno essere resa leggibile dall'utente, poiché nel primo caso potrebbe generare un problema di security (ricordiamoci che la querystring esporrebbe le informazioni di stato). Per questo motivo, di default la proprietà EnableSecureHistoryState è impostata a true, generando un URL cifrata del tipo:
http://localhost:49526/WebSite1/Default.aspx#&&DwIbkbGQcKwH...
Technorati Tag:
AJAX,
ASP.NET