I clienti che passano da un ambiente client ad uno web spesso desiderano le stesso comodità tipiche del client anche sul web, non conoscendo i limiti "by design" delle interfaccie web.
Per esempio l'implementazione del controllo di campi modificati e relativo messaggio sulla chiusura di form di data-entry.
Per ottenere questo non esiste un unico metodo, comunque asp.net non ha niente di nativo pronto all'uso.
Una soluzione,la prima che può venire in mente, è quella di gestire la chiusura della window generando un postback, controllare la modifica dei dati sul server e generare il javascript necessario.
La soluzione ottimale rimane quella di gestire il controllo completamente lato client.
Vediamo una possibile implementazione, che è quella che ho pensato per il mio progetto:
1) La classe dell'aspx o ascx base crea un campo nascosto che servirà per mantenere il valore, anche tra i postback, di modifica di almeno un campo della form
// Carico il campo che indica se ho modificato i dati di input della maschera
if (!this.IsPostBack)
{
this.Page.RegisterHiddenField( _HIDDEN_CHANGEFIELD, "0");
}
else
{
this.Page.RegisterHiddenField( _HIDDEN_CHANGEFIELD, this.Page.Request.Form[ _HIDDEN_CHANGEFIELD] );
}
2) Nel load dell'aspx o ascx(dipende dove sono i controlli da verificare), per ogni controllo di input devo creare l'evento client 'onchange' (textbox e dropdown), piuttosto che 'onclick' (checkbox) in cui valorizzo un campo nascosto.
if
(control is CheckBox)
{
control.Attributes.Add("onclick", "document.getElementById('" + _CLIENT_CHECK_CHANGEDFIELD + "').value = 1;");
}
else
{
control.Attributes.Add("onchange", "document.getElementById('" + _CLIENT_CHECK_CHANGEDFIELD + "').value = 1;");
}
3) Sull'evento client di chiusura(per esempio tramite un bottone specifico, io sconsiglio l'utilizzo della 'x' ed educo gli utilizzatori dell'applicazione a chiudere dal bottone 'Chiudi' creato apposta) non mi resta altro che controllare il valore del campo nascosto per generare il messaggio di notifica.
Con questa soluzione il lavoro è minimo in quanto, una volta incapsulato il punto 2 in un metodo, dal codice delle form web devo solamente richiamarlo N volte per i mie N controlli di input.
Se qualcuno ha soluzioni diverse sarei ben lieto di conoscerle ... :)