Quale strada perseguire?

venerdì 27 giugno 2008 - 14.11

sarcidi Profilo | Newbie

Salve a tutti,
vorrei chiere il vostro autorevole parere in merito ad una questione che non
riesco a risolvere basandomi sulla mera consultazione di Google :-)
Supponiate di avere una DropDownList come *primo* (sia dal punto di vista
logico che grafico) elemento di una pagina web.
Una volta eseguito il DataBind, i dati accessibili a seguito di una
selezione da parte dell'utente saranno il DataTextField (nel mio caso la
descrizione della chiave di una tabella) ed il DataValueField (la chiave
della tabella stessa).
Tutto il flusso a livello interfaccia utente che si scatena a seguito della
selezione (mi riferisco a controlli messi a disposizione dell'utente come
TextBox, GridView, DropDownList), dipendono proprio da campi (SQL) del record
selezionato.
Siccome non posso permettermi di eseguire ad ogni operazione dell'utente una
query per recuperare il valore di questi, e dal momento che il DataBind mi
"brucia" il DataSource, non esiste un metodo "smart" per risolvere questo
problema? Non c'è un modo per "estendere" l'oggetto DropDownList affinché
dopo il DataBind preservi il valore di altri campi oltre a quelli del
DataValueField e del DataTextField?
Grazie a chi mi risponderà, vi prometto che la prossima volta sarò più
conciso :-)
Sergio

paoval72 Profilo | Senior Member

Ciao. Per recuperare i dati usi una select o una stored procedure?
Credo di sì. Di solito io metto il risultato della query in un dataset. Poi, faccio il bind coi 2 campi della dropdownlist e mi resta comunque il dataset con tutti i dati, che volendo posso poi filtrare a livello di codice in base all'item selezionato della DDl.
Spero di avere capito bene il tuo problema e di avere dato una possibile soluzione.

Paolo

Wamba Profilo | Expert

Non certo di aver capito ma:
Hai una pagina "multi input" secondo il valore selezionato in una combo devono essere visibili dei controlli piuttosto che altri.
Se è così io: raccoglierei i controlli in div o span in base a quando devo essere visibili e popolerei tutti i campi.
Quando cambia il valore della combo renderei visibile il div corrispondente e nasconderei gli altri.
-----------------------------------------------------------
Solo chi ha il Caos dentro può generare una stella danzante
Wamba
http://blogs.ugidotnet.org/WamBlog/
http://www.intellimaker.com

sarcidi Profilo | Newbie

>Ciao. Per recuperare i dati usi una select o una stored procedure?

Sì.

>Credo di sì. Di solito io metto il risultato della query in un
>dataset. Poi, faccio il bind coi 2 campi della dropdownlist e
>mi resta comunque il dataset con tutti i dati, che volendo posso
>poi filtrare a livello di codice in base all'item selezionato
>della DDl.

Com'è possibile? Il DataSet, dopo che si esegue una selezione dalla DropDownList, non è più disponibile in memoria!

Sergio

sarcidi Profilo | Newbie

>Non certo di aver capito ma:
>Hai una pagina "multi input" secondo il valore selezionato in
>una combo devono essere visibili dei controlli piuttosto che
>altri.

Bravo.

>Se è così io: raccoglierei i controlli in div o span in base
>a quando devo essere visibili e popolerei tutti i campi.
>Quando cambia il valore della combo renderei visibile il div
>corrispondente e nasconderei gli altri.

Ok, grazie per la soluzione, però... dopo anni di programmazione in Win32 (C#)
trovo che questa sia una soluzione (ancorché necessaria forse perché siamo in ambito web)
non elegante. Non c'è un altro "trucco"? Bisogna davvero lavorare così in ambito web?
Non si possono usare oggetti come la Cache (chiedo in quanto brancolo nel buio...) ?
Grazie.
Sergio

paoval72 Profilo | Senior Member

Nel mio caso, ad esempio, salvo il dataset in una Session che mi creo (o in un viewstate) e che posso richiamare dovunque:
//salvo in session
Session["Pluto"]=ds //ds è il dataset erstituito dalla query

//Poi richiamo la session
DataSet dstemp= (DataSet) Session["Pluto"];


Paolo



Wamba Profilo | Expert

Paolo occhio!
Il Dataset è un oggetto estremamente pesante e metterlo in session è pericoloso:la tua applicazione può funzionare per 10 utenti ed uccidere un server per 100.
Se vuoi un approccio più elegante si può trovare:
Crei una tua classe serializzabile che contiene tutti i dati utili all'utente. Nella classe implementerei un pattern lazy in modo da non dover gestire manualmente il load dei dati.
Dove salvi questa classe? Dipende dalla frequenza d'uso, dal tempo medio di validità delle informazioni e se le informazioni sono comuni a tutti gli utenti o sono "personali". Quindi la scelta è fra session, cache lato server, application o file. Io opto quasi sempre per la cache server perchè permette di gestire le relazioni fra informazioni la durata e di intercettare la distruzione del dato attraverso i delegate (se devi differenziare per utente ci sono dei trucchi come si formattare la variabile cache con un nome tipo "INFORMAZIONI_11111" dove 11111 è l'id univoco dell'utente.
Infine lato client attraverso un updatepanel puoi andare a renderizzare quello che ti serve, quest'ultima parte però richiede l'uso di controlli dinamici.
-----------------------------------------------------------
Solo chi ha il Caos dentro può generare una stella danzante
Wamba
http://blogs.ugidotnet.org/WamBlog/
http://www.intellimaker.com

sarcidi Profilo | Newbie

>Paolo occhio!
>Il Dataset è un oggetto estremamente pesante e metterlo in session
>è pericoloso:la tua applicazione può funzionare per 10 utenti
>ed uccidere un server per 100.

Io devo gestire situazioni per un numero di utenti superiore a 100
Grazie per la segnalazione.

>Se vuoi un approccio più elegante si può trovare:
>Crei una tua classe serializzabile

Perdonami, cosa si intende per "classe serializzabile" in C#?

>che contiene tutti i dati
>utili all'utente. Nella classe implementerei un pattern lazy
>in modo da non dover gestire manualmente il load dei dati.
>Dove salvi questa classe? Dipende dalla frequenza d'uso, dal
>tempo medio di validità delle informazioni e se le informazioni
>sono comuni a tutti gli utenti o sono "personali". Quindi la
>scelta è fra session, cache lato server, application o file.
>Io opto quasi sempre per la cache server perchè permette di gestire
>le relazioni fra informazioni la durata e di intercettare la
>distruzione del dato attraverso i delegate (se devi differenziare
>per utente ci sono dei trucchi come si formattare la variabile
>cache con un nome tipo "INFORMAZIONI_11111" dove 11111 è l'id
>univoco dell'utente.

Scusami, nel caso di Cache, viene gestita a livello di sessione?
In caso affermativo, come fa ASP .NET a discernere la mia sessione dalla tua in un "mondo stateless"?

>Infine lato client attraverso un updatepanel puoi andare a renderizzare
>quello che ti serve, quest'ultima parte però richiede l'uso di
>controlli dinamici.

Grazie infinite.
Sergio

Wamba Profilo | Expert

Scusa il ritardo nella risposta: stò picchiandomi con un'operazione ajax e stà vincendo lei

>>Paolo occhio!
>>Il Dataset è un oggetto estremamente pesante e metterlo in session
>>è pericoloso:la tua applicazione può funzionare per 10 utenti
>>ed uccidere un server per 100.
>
>Io devo gestire situazioni per un numero di utenti superiore
>a 100
>Grazie per la segnalazione.
Ovviamente 100 non è un numero da prendere per buono, ma è un esempio. La session è memorizzata in ram, se mettiamo oggetti troppo pesanti ingolfiamo la memoria del server.

>>Se vuoi un approccio più elegante si può trovare:
>>Crei una tua classe serializzabile
>
>Perdonami, cosa si intende per "classe serializzabile" in C#?
Per farla breve è una classe in cui tutti gli elementi (non dichiarati "non serializzabili") sono trasformabili in una stringa, in modo da essere gestita in modo particolare come ad esempio "congelare" lo stato di una classe e cacciarlo nel db. Questo però ti serve solo in casi particolari. Probabilmente non ne hai bisogno.

>>che contiene tutti i dati
>>utili all'utente. Nella classe implementerei un pattern lazy
>>in modo da non dover gestire manualmente il load dei dati.
>>Dove salvi questa classe? Dipende dalla frequenza d'uso, dal
>>tempo medio di validità delle informazioni e se le informazioni
>>sono comuni a tutti gli utenti o sono "personali". Quindi la
>>scelta è fra session, cache lato server, application o file.
>>Io opto quasi sempre per la cache server perchè permette di gestire
>>le relazioni fra informazioni la durata e di intercettare la
>>distruzione del dato attraverso i delegate (se devi differenziare
>>per utente ci sono dei trucchi come si formattare la variabile
>>cache con un nome tipo "INFORMAZIONI_11111" dove 11111 è l'id
>>univoco dell'utente.
>
>Scusami, nel caso di Cache, viene gestita a livello di sessione?
>In caso affermativo, come fa ASP .NET a discernere la mia sessione
>dalla tua in un "mondo stateless"?
La cache è una memoria alternativa alla sessione che ha molti vantaggi differenti: ad esempio è possibile gestire come il server deve gestirne la cancellazione per ovviare ai problemi di performance o la validità dei dati.
Ti consiglio di leggerti qualcosa sull'argomento: http://www.aspitalia.com/articoli/asp.net/cache.aspx

>
>>Infine lato client attraverso un updatepanel puoi andare a renderizzare
>>quello che ti serve, quest'ultima parte però richiede l'uso di
>>controlli dinamici.
>
>Grazie infinite.
>Sergio
Prego figurati, ma quest'approccio è notevolmente più complesso (non sottovalutare i controlli dinamici).


-----------------------------------------------------------
Solo chi ha il Caos dentro può generare una stella danzante
Wamba
http://blogs.ugidotnet.org/WamBlog/
http://www.intellimaker.com
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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5