Miglior strategia per mantenere persistenti le scelte in un motore di ...

giovedì 12 gennaio 2012 - 15.26
Tag Elenco Tags  C#  |  .NET 4.0  |  Windows Server 2003  |  Visual Studio 2010  |  SQL Server 2005  |  Office 2007

Newcomsas Profilo | Newbie

Salve a tutti.
Mi trovo di fronte ad un problema che dovrebbe essere piuttosto comune
con un motore di ricerca in c# ma non sono certo di conoscere una
soluzione ottimale.
Immaginate una maschera di ricerca complessa con decine tra radio
button, menu' a tendina, campi testo ecc.; al clic su 'ricerca' vengono
visualizzati i risultati in un gridview paginato. In ogni riga del
gridview compare un tasto 'modifica' che fa accedere ad una pagina di
dettaglio (si tratta di informazioni anagrafiche). E' possibile che
l'utente esegua delle modifiche sulla pagina di dettaglio e poi salvi
i cambiamenti.
A questo punto vorrei avere un tasto 'torna ai risultati' che
ricarichi il modulo di ricerca con i criteri di ricerca impostati
all'inizio.
Qual e' il modo migliore per ottenere questo effetto ? Vorrei evitare
di salvare in session i contenuti di ogni singola opzione di ricerca.
C'e' qualche strumento gia' integrato in c# che permetta di farlo ? Si
puo' agire sul view state ?
Grazie in anticipo per l'aiuto
Newcomsas

PS. Dimenticavo: ovviamente dovrei tornare in automatico alla pagina
corretta del gridview. Se sono in pagina 5, clicco su modifica, poi
dalla pagina di dettaglio salvo e clicco su 'torna ai risultati' devo
rivedere pagina 5.
Newcomsas

Gluck74 Profilo | Guru

potresti si usare il viewstate, meglio la session o addirittura la cache.

Io ho adottato questa soluzione (sicuramente migliorabile):
//piccola struct per salvare i parametri di ricerca struct parametroRicerca { public string campo; //il parametro della query o del datasource public string valore; // il testo scritto nel textbox public string controllo; //ID del controllo } //metodo per fare la ricerca List<parametroRicerca> NuovaRicerca() { //prendo i controlli nel pannello di ricerca //creo per ognuno che è valorizzato un oggetto parametroRicerca //lo aggiungo alla lista } //metodo per il salvataggio void SalvaRicerca() { List<parametroRicerca> listaParametri = NuovaRicerca(); //qui scegli tu // listaParametri -> viewstate // listaParametri -> session // listaParametri -> cache }

____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

Newcomsas Profilo | Newbie

Grazie Gluck,

in effetti penso che lavorerò sulla soluzione che hai suggerito.

Mi chiedevo però: perchè non dovrebbe essere possibile mettere in cache l'intera pagina ed eventualmente aggiornare i risultati della ricerca nella pagina di esempio con un oggetto 'substitution'.
Io sto studiando da pochissimo tempo l'oggetto cache ma dalla documentazione il suo uso sembra abbastanza lineare. All'atto pratico però non funziona.

Come dicevo ho una pagina 'elenco' che contiene un modulo di ricerca e un updatepanel con gridview che visualizza i risultati. In questa pagina, che è una content page, ho inserito la direttiva 'outputcache'. Se clicco sul tasto modifica di una riga del gridview, accedo alla pagina di dettaglio e poi da qui con un link torno alla pagina 'elenco' si ripresenta il modulo di ricerca _resettato_ e il gridview _vuoto_. Mi sarei aspettato che l'oggetto cache 'fotografasse' l'ultimo stato della pagina (se ho scelto la voce 'pippo' in un menù a tendina della ricerca dovrei rivedere la voce 'pippo' al click su 'torna all'elenco').

Volevo chiedere a chi conosce l'oggetto se una funzionalità come quella che ho descritto è realizzabile o meno.

Grazie,

Newcomsas

Gluck74 Profilo | Guru

sinceramente non ho mai usato la cache a livello di pagina....
però il problema che mi dici mi fa pensare ad un'anomalia che forse non c'entra con la cache, piuttosto con il bind dei dati.

ti do due link dove puoi leggere preziose informazioni
http://msdn.microsoft.com/en-us/library/06bh14hk(v=vs.90).aspx
http://www.4guysfromrolla.com/articles/022802-1.aspx

____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.

Newcomsas Profilo | Newbie

Salve Gluck, si conoscevo già le pagine di cui riportavi i link, ma nulla sembra funzionare nel mio caso.
Ho invece preparato le procedure per mettere in pratica la soluzione che hai proposto. Problema: premendo il tasto 'torna ai risultati' nella pagina di 'dettaglio', la pagina 'lista' è richiamata ma viene del tutto saltato l'evento Page_Load. In pratica, anche togliendo la direttiva outputcache sembra che una qualche forma di cache venga comunque eseguita. Nell'evento Page_Load naturalmente dovrei chiamare una funzione 'CaricaControlli' che legga i dati dall'oggetto List (ho poi deciso di salvarlo in session) e poi ripristinare i valori di campi testo, tendine ecc. nel modulo di ricerca. Anche gli altri eventi (come il Pre_render dell'updatepanel che contiene il modulo di ricerca) non sono attivati quando si passa da 'dettaglio' a 'lista'. A nulla serve cercare di eliminare la cache con le soluzioni proposte nei forum, ad esempio con:

Response.Cache.SetExpires(DateTime.UtcNow.AddMinutes(-1));
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetNoStore();

in Page_Load (per lo meno al primo caricamento della pagina questo evento è chiamato regolarmente quindi la cache non dovrebbe attivarsi...)

Per caso anche tu hai affrontato questo problema a suo tempo ? Grazie.

PS. No, risolto il problema; in realtà usavo per tornare alla pagina 'lista' un oggetto HyperLink; usando un normale Button l'evento Page_Load di 'lista' è richiamato senza problemi. Lascio comunque il messaggio in caso l'informazione potesse servire in futuro ad altri.

Gluck74 Profilo | Guru

che venga saltato del tutto l'evento Page_Load mi pare strano, forse hai messo un Page.IsPostBack

Cliccando su un link, l'evento Page_Load viene richiamato comunque, ma non è un PostBack.

ciao

____________
Ricordati di utilizzare il tasto "Accetta" se i nostri consigli ti sono serviti a risolvere il problema.
È il modo per ringraziare chi ti ha aiutato.
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5