Problema con l'ordine degli eventi e le variabili di sessione

sabato 27 novembre 2004 - 12.31

s_dimaio Profilo | Junior Member

Sto facendo un semplice usercontrol per il login. Alla pressione del bottone scatta l'evento onclick che controlla i dati e, se corretti, riempie una variabile di sessione con l'id dello user.

Nel page_load della pagina invece ho inserito qualcosa del tipo:




Sub Page_Load(sender As Object, e As EventArgs)

if isnothing(session("user")) Then
place.visible = false
Else
place.visible = true
End If

End Sub




che mostra o nasconde un placeholder.

Il mio problema è che quando premo il bottone arriva prima l'evento page che trovando la sessione vuota non mostra il placeholder. Dopo arriva l'evento onclick che verifica i dati e riempie la sessione ma troppo tardi.
Per vedere il placeholder devo fare un refresh della pagina...spero di essere stato chiaro.

Come posso risolvere?

Ciao e grazie

Brainkiller Profilo | Guru

Mi sa che devi gestire il postback.
Prova a inserire quel blocco nel Page_Load all'interno di un If del tipo:

if Not Page.IsPostBack then

end if

ciao
david

s_dimaio Profilo | Junior Member

Se ho capito mi stai suggerendo di eliminare la sub OnClick e gestire tutta la parte del login all'interno del page load, giusto?

Ci avevo pensato anch'io, però ho un dubbio: if ispostback all'interno del page_load del controllo intercetta tutti i postback del controllo o anche quelli della pagina.
In altre parole se premo un tasto al di fuori dello usercontrol parte lo stesso lo script per il login?

Brainkiller Profilo | Guru

I controlli hanno un Control_Load e la pagina un Page_Load.
Se metti due breakpoint nel page load e nel control load e simuli un autenticazione durante un debug vedi il lifecycle della pagina così vedi quando scattano i vari Load.
Comunque mi sembra che stai cercando di fare un'autenticazione ASP classico applicata ad ASP.NET.
Ti consiglio di leggere tutto il paragrafo chiamato "Securing Applications" nel .NET Framework lì c'è spiegato come fare l'autenticazione ASP.NET.

ciao
david

s_dimaio Profilo | Junior Member

Chiariscimi una cosa: all'interno di uno usercontrol l'evento Load del controllo come lo intercetto?

Io fino ad ora usavo anche nel controllo (come nella pagina) Sub Page_Load (s as object, e as eventargs)

Invece devo usare Sub Control_Load ?

Ho fatto una prova semplice del tipo:

<%@ Control Language="VB" Debug="true" %>
<script runat="server">

Sub Control_Load(sender As Object, e As EventArgs)

response.write ("ciao")

End Sub

</script>

.
.
.

Però non è successo nulla...sbaglio qualcosa?

Brainkiller Profilo | Guru

Scusa, mi sono spiegato male io.
L'evento è lo stesso per pagina e per controllo è sempre il Load.
Io però spesso creo nomi diversi appunto Page_Load per la pagina e Control_Load per i controlli in modo d arendere più facile la fase di debug.

Come mai tu non usi il codebehind ?

ciao
david

s_dimaio Profilo | Junior Member

Perfetto, io purtroppo non posso ancora permettermi queste sofisticazioni visto che non riesco a saltare fuori nemmeno da un login...

Uso il code-behind. Solo che quando ho letto del control page ho buttato giù al volo una pagina di prova per vedere la differenza.

Ti chiedo una cosa che ho notato: per capire all'interno del Page_Load del controllo quale bottone è stato premuto avevo pensato molto semplicemente di fare:

Sub Page_Load (s As Object, e As EventArgs)

Dim NomeMioBottone As string = s.id

.
.
-
però mi restituisce l'id del mio UserControl anzichè quello del bottone posto dentro lo UserControl...come posso risolvere?

LudovicoVan Profilo | Junior Member

> Se ho capito mi stai suggerendo di eliminare la sub OnClick e gestire tutta la parte del login all'interno del page load, giusto?

No, nessun limite, piuttosto lo schema "canonico" è il seguente:

--------------------------
Sub Page_Load(...)
If Not IsPostBack Then
InitMyControls(...)
End If
End Sub

Sub Ctrl1_Click(...)
ProcessCtrl1Click(...)
InitMyControls(...)
End Sub

Sub InitMyControls(...)
...
End Sub

Sub ProcessCtrl1Click(...)
...
End Sub
--------------------------

Dunque, la soluzione concreta al tuo problema è quella delineata inizialmente da Brainkiller (da rileggere alla lettera), unita al fatto che la "gestione" in questione va invocata *anche* in coda all'onclick, dunque è conveniente estrapolarla ina una funzione a parte (che nell'esempio ho indicato con InitMyControls(); la gestione del login starebbe invece nella ProcessCtrl1Click()).

Per dettagli sul ciclo di vita delle pagine web in ASP.NET, si può dare un'occhiata a http://msdn.microsoft.com/library/en-us/vbcon/html/vbconWebFormsPageProcessingStages.asp

HTH. -LV

s_dimaio Profilo | Junior Member

Non è che ho capito tantissimo. ProcessCtrl1Click() si occupa di fare tutte le operazioni di login (controllo username e password e se corrette riempie variabile di sessione), ma InitMyControls() non ho capito cosa farebbe? Fa il controllo sulla variabile di sessione?

Io per ora ho risolto così: nello usercontrol ho eliminato l'onclick e gestisco il tutto dal Page_Load grazie al postback (compreso il riempire le sessioni).
Nella pagina verifico se la sessione è piena o meno nel prerender.

Sono comunque pronto a cambiare, cosa ne dite?

LudovicoVan Profilo | Junior Member

> InitMyControls() non ho capito cosa farebbe

In InitMyControls() ci sarebbe la gestione del tuo "placeholder".

Ciao. -LV
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