Pssaggio valori tra due pagine (in modo sicuro)

giovedì 26 ottobre 2006 - 16.05

squilibrio Profilo | Expert

Ciao, un consiglio: ho un datagrid con per ogni riga qualche cosa del tipo

paginadettaglio.aspx?ID=<% DataBinder.Eval(Container.DataItem, "Campo)%>&AltroCampo

ecc...

poi nella paginadettaglio recupero il tutto tramite il request.QueryString

(uso .NET 2.0)

Ovviamente funziona tutto ma questa logica non mi piace per ragioni di sicurezza.

Come posso trasformare questa operazione in un'operazione sicura? quindi che non renda visibili/modificabili i parametri passati tra le pagine?

Qualcuno potrebbe farmi un semplice esempi su come modificare il codice sopra indicato?

Grazie

teologoeretico Profilo | Newbie

Perchè non provi ad usare le variabili di sessione ?
E' un metodo rozzo e antico, ma funziona :)
"All I want is a Dataset..."

squilibrio Profilo | Expert

Si esatto la logica session la adottavo anche io

però ora il mio problema è che ho un datagrid con un link inserito in ogni
riga del datagrid (con elementi presi dal DB) (nell'HTML del datagrdi)...
quindi come posso riempire la variabile di sessione se costruisco il link
nell'HTML del datagrid? devo lavorare sull'itemdatabound?? non so come fare
:(((

teologoeretico Profilo | Newbie

Uhm...invece di usare un link HTML, potresti usare un controllo LinkButton dentro un itemtemplate del tuo GridView(Ma vale anche per un repeater o per una datalist), in questo modo:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Per intercettare l'evento Click del link scelto dall'utente, nella Gridview, aggiungi poi il seguente codice VB (stai usando VB.NET, giusto? )

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Nell'evento Load della nuova pagina, poi, ricordati di leggere la variabile di sessione!

Come vedi, il gioco sta tutto nell'impostare gli attributi CommandName e CommandArgument del controllo server LinkButton. Che rimane comunque una soluzione più robusta rispetto al classico link HTML.

Cmq, questa soluzione, rimane ovviamente valida se e solo se il browser del client supporta i cookies.

Se poi stai utilizzando una Web Application che untilizza un sistema di Login, sarebbe più pratico ed elegante utilizzare l'oggetto Profile.

Ma così con la buona vecchia Session Variable, dovrebbe già funzionare.
"All I want is a Dataset..."

squilibrio Profilo | Expert

Grazie mille per la risposta!

La tua soluzione andrebbe benissimo ma ho un problema nella tua sub (uso C# cmq ) .... ed ho sbagliato, uso un datalist non un datagrid (non cambia molto però)

Ho aggiunto il mio linkbutton

per quale motivo devo definire un metodo di questo tipo

Private Sub GridView1_RowCommand(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewCommandEventArgs) Handles GridView1.RowCommand

RowCommand? chi lo richiama questo metodo? non ho trovato nessun riferimento a questo metodo e non capisco come/quando viene richiamato

Esempio pratico:

Se il mio link html fosse stato qualche cosa del tipo:
link.aspx?ID1=Elemento1PresoDalDB&ID2=Elemento2PresoDalDB
cosa avrei dovuto mettere nel CommandArgument??
CommandArgument='<%# DataBinder.Eval(Container.DataItem,"Elemento1PresoDalDB") %>'
corretto? ma in questo modo ho associato un solo parametro e l'altro?

come gestisco il metodo che mi hai allegato? intendo: come lo richiamo (mio problema iniziale) e come gestire le 2 var sessione, corrispondenti ai 2 campi del DB che mi servono?

Grazie infinite per l'aiuto

teologoeretico Profilo | Newbie

Procediamo con ordine :)

>La tua soluzione andrebbe benissimo ma ho un problema nella tua
>sub (uso C# cmq ) .... ed ho sbagliato, uso un datalist
>non un datagrid (non cambia molto però)
>
>Ho aggiunto il mio linkbutton
>
>per quale motivo devo definire un metodo di questo tipo
>
>Private Sub GridView1_RowCommand(ByVal sender As Object, ByVal
>e As System.Web.UI.WebControls.GridViewCommandEventArgs) Handles
>GridView1.RowCommand

>RowCommand? chi lo richiama questo metodo? non ho trovato nessun
>riferimento a questo metodo e non capisco come/quando viene richiamato


In realtà sia il Gridview, che il Repeater e la Datalist espongono di default un evento che intercetta qualsiasi comando che proviene da un loro item. Questo evento è "rowcommand" per la Gridview e "itemcommand" per la Datalist e il Repeater.

Se usi VSStudio 2005, puoi trovare questi metodi nell'editor del codice VB (o C#): nella tendina in alto a sinistra selezioni la tua datalist, e nella tendina in alto a destra trovi tutti i suoi metodi.

Nel caso della datalist, dunque, si può tranquillamente definire un metodo come

Protected Sub DataList1_ItemCommand(ByVal source As Object, ByVal e As System.Web.UI.WebControls.DataListCommandEventArgs) Handles DataList1.ItemCommand

che come vedi non differisce molto da quello del Gridview, se non per il fatto che hai ItemCommand al posto di RowCommand.

Il comando intercettato, lo definisci proprio nel controllo server Linkbutton:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

>
>Esempio pratico:
>
>Se il mio link html fosse stato qualche cosa del tipo:
>link.aspx?ID1=Elemento1PresoDalDB&ID2=Elemento2PresoDalDB
>cosa avrei dovuto mettere nel CommandArgument??
>CommandArgument='<%# DataBinder.Eval(Container.DataItem,"Elemento1PresoDalDB")
>%>'
>corretto? ma in questo modo ho associato un solo parametro e
>l'altro?
>
>come gestisco il metodo che mi hai allegato? intendo: come lo
>richiamo (mio problema iniziale) e come gestire le 2 var sessione,
>corrispondenti ai 2 campi del DB che mi servono?
>


L'attributo CommandArgument, come vedi ha come valore una stringa formattata come "Elemento1PresoDalDB@Elemento2PresoDalDB",

utilizzando il costrutto String.Format di VB (ma credo che in C# sia simile).

Puoi concatenare tutti i valori che vuoi in questo modo.

A questo punto, dentro il metodo ItemCommand del Datalist, splitti la stringa e assegni i tuoi valori a due variabili di

sessione:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra


Tieni presente che le variabili di sessione le puoi utilizzare proprio quando ti servono, ma usale con cautela, perchè fino a

che dura la sessione, queste esistono, mantenendo i valori che l'utente gli ha assegnato l'utente.

>Grazie infinite per l'aiuto
>


Ti ho fatto l'esempio in VB.NET, ma credo che con poco sforzo, riuscirai tranquillamente a convertirlo in C#...
Spero che ora avrai le idee un po' + chiare...magari cercati qualche tutorial sulle variabili di sessione, che potrà aiutarti

a capire meglio.

Spero di essere stato utile.
Buon lavoro

"All I want is a Dataset..."

squilibrio Profilo | Expert

Grazie per tutte le info dettagliate!!!

Mi piace proprio questa soluzione!! Nascondo ogni tipologia di informazione.


A questo punto mi conviene, in ogni pagina, introdurre un controllo per verificare che le var di sessione siano valorizzate (per errori di vario tipo oppure perchè è scaduta la sessione).
Io farei, in ogni pagina:


if (Session["bla bla 1"] == null) || ((Session["bla bla 1"] == null).... )

Response.Redirect("PaginaIniziale.aspx)

Ti sembra una soluzione corretta?

Thanks

teologoeretico Profilo | Newbie

Beh si...una qualche forma di controllo sulla sessione ci vuole, anche perchè in uno scenario operativo non è raro che una sessione possa saltare o perdersi. Mi sembra una buona idea.
"All I want is a Dataset..."

squilibrio Profilo | Expert

Grazie ancora!

teologoeretico Profilo | Newbie

Di nulla
"All I want is a Dataset..."
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-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5