Intercettare unload di un wizard

lunedì 05 novembre 2007 - 11.11

amstrad Profilo | Junior Member

Ciao a tutti, ho la necessità di intercettare l'unload di un wizard o della pagina che lo contiene, per svuotare dalla sessione svariati oggetti che inserisco durante i vari step del wizard stesso.
ho provato a utilizzare l'evento unload dell'ogetto wizard, ma sembra che si scatena ogni volta che viene visualizzato e mai quando viene unloaddato.
qualche suggerimento?
forse non è l'unload che mi occorre, ma cmq mi serve sapere quando l'utente cambia pagina, fatta eccezione se viene aperto un popup dal wizard, (in quel caso la session non và svuotata)

pozzoli.samuele Profilo | Senior Member

Se ho capito cosa voi fare... Bhè... Non è mica semplice!

Preparati a metterti le mani nei capelli!

Parti dal concetto che quando una pagina la mandi al client... Non sai più che fine fa. Pensa solo se il client, viene chiuso, senza fare click all'uscita dalla pagina. Tu non hai traccia sul server di questa chiusura.

Non siamo su una windows application!

Quindi. La soluzione (che non risolve comunque la chiusura del client) è quella di utilizzare i link di uscita. Tutti quelli che hai sulla pagina e uccidere gli oggetti ad ogni uscita.

Altrimenti mi sa che non hai soluzioni...

Comunque il problema è un pochino fumoso.
Se mi dai qualche dattaglio in più, cerchiamo di illuminare meglio la situazione.

Tipo dove sono gli oggetti, come li istanzi...

Ricorda che il .net framework, dovrebbe avere un garbage collector...

amstrad Profilo | Junior Member

allora rispondo ora, ma nel fine settimana ho adottato una soluzione efficace.
sulla pagina aspx ho messo un script che mi apre un'altra pagina (svuotaSessione.aspx) dove c'è il codice per eliminare dalla sessione gli oggetti indesiderati, questa pagina si chiude istantaneamente dopo aver terminato di eseguire le operazioni e viene aperta già minimizzata e dietro alla principale, così da non dare fastidio.
questo script lo ho messo alla unload del body della pagina sulla quale devo fare il controllo che venga cambiata o dalla quale usciamo, e fino ad ora non mi ha dato problemi, lo so che non è una soluzione elegante e perfetta ma per quanto mi riguarda sembrerebbe funzionare.
mi piacerebbe riuscire a fare una cosa come quella che mi hai detto tu ma la pagina ha troppi link di uscita, compreso un menù dinamico competamente in js, che sto iniziando ad odiare ma devo tenere a tutti i costi -.-, e credo che anche se la piu rozza questa si la soluzione piu facile e diretta. se non è così ditemelo ^^

pozzoli.samuele Profilo | Senior Member

Se usi javascript... Bhè, allora.... Alla grande!

Con javascript, dovresti riuscire ad intercettare la chiusura della pagina! Mi pare con una cosa del genere:

<body onUnload="MyFunction();">

A questo punto, in my function fai una httporequest, ad una pagina aspx che svuota la session e si uccide!

Dovrebbe funzionare. Senza popup... (Che ormai sono bloccati da tutti) e in modo pulito...

Non trovi? Per l'hhtp request.... Bhè... SE NON SBAGLIO! In javascript dovrebbe suonare tipo:

req = new XMLHttpRequest();
req.open("GET", url, true);
req.send(null);


Puoi anche implementare una cosa più complessa, tipo:

function loadXMLDoc(url)
{
// branch for native XMLHttpRequest object
if (window.XMLHttpRequest) {
req = new XMLHttpRequest();
// req.onreadystatechange = processReqChange; (Da mettere se vuoi che al ritorno venga chiamata una funzione, non è il tuo caso.)
req.open("GET", url, true);
req.send(null);
// branch for IE/Windows ActiveX version
} else if (window.ActiveXObject) {
req = new ActiveXObject("Microsoft.XMLHTTP");
if (req) {
// req.onreadystatechange = processReqChange; (Da mettere se vuoi che al ritorno venga chiamata una funzione, non è il tuo caso.)
req.open("GET", "url", true);
req.send();
}
}
}



Facci sapere se lo implementi e se gira!

amstrad Profilo | Junior Member

al momento ho dovuto implementare il mio script fatto al volo e molto piu magro e indelicato del tuo, ma funzionale

function callDeleteSession()
{
window.open("DeleteSessionObject.aspx","DeleteSession");
}

appena possibile proverò il tuo che mi sembra molto piu versatile e ricco di opportunità.
per adesso però causa consegne e ritardi mi tengo questo almeno per adesso :(

pozzoli.samuele Profilo | Senior Member

Speriamo che non ti blocchino i popup allora!

amstrad Profilo | Junior Member

Come non detto, primo problema rilevato
L'evento unload del body della pagina sembra scatenarsi anche se utilizzo un drop down list sulla quale ho abilitato l'autopostback e quindi immagino che sia così per tutti i postback che faccio nella pagina e sono tanti.
però questo non lo risolvo neanche con il tuo script.
è un problema di quando lanciare, non di come lanciare.
mi sto ammattendo, suggerimenti?

pozzoli.samuele Profilo | Senior Member

Eh certo! Se fai un postback... Ti scarica la pagina! Sicuro! Il postback, diventa una chiusura della pagina. Risulta un casino anche con il mio metodo! A meno di mettere il contenuto della pagina in un update panel di ajax! Allora te la cavi e dovrebbe andare bene anche il tuo sistema!

Infatti il postback di ajax, non scarica la pagina, ma solo l'update panel!

amstrad Profilo | Junior Member

non ho mai usato ajax, potresti farmi un brevissimo esempio di come implementare questa cosa, o ti chiedo troppo?

pozzoli.samuele Profilo | Senior Member

>non ho mai usato ajax, potresti farmi un brevissimo esempio di
>come implementare questa cosa, o ti chiedo troppo?

Assolutamente no.

Comincia a scaricare il pacchetto di installazione da ajax.asp.net.

Installi su client e server.

Poi crei un nuovo sito AJAX enabled e copi tutto ciò che manca dal web.config di quest'ultimo nel tuo... LAvoraccio, ma indispensabile.

La pagina la modifichi come segue:

Metti tutto quello che devi aggiornare in un

***Prima il gestore del framework lato client...
<asp:scriptmanager />

***Poi l'update panel
<asp:updatepanel>
***Il contenuto, compreso in un
<contenttemplate>
Contenuto, compresi i pulsanti che aggiornano la pagina o i controlli con autopostback...
</contenttemplate>
<asp:updatepanel>

E con questo ottieni già quello che vuoi.

Un po' incasinata la preparazione del sito, ma per il resto dovrebbe essere molto semplice!

Ps: Ovviamente, non mettere nell'update panel cose che redirigono la pagina, o il body, con l'evento unload. Altrimenti viene scatenato quando fai il postaback di quella parte di pagina!

Perfect.. Penso che in mezzoretta risolvi!

amstrad Profilo | Junior Member

grrrrr non vogliono usare ajax, altrimenti potrei fare tutto da script visto che tramite ajax con un client script si arriva anche alla session.
quindi ipotesi scartata...
niente ajax e niente soluzioni semplici come al solito. quanto voglio lavorare con una windows application. ma il capo ignorante pretende una web application che si comporti come un windows apllication, e io ci perdo la vista davanti al pc.
a me non viene in mente nessun modo per intercettare solo quando lascio quella pagina per andare su un'altra e poter svuotare la sessione, a te?

pozzoli.samuele Profilo | Senior Member

>grrrrr non vogliono usare ajax, altrimenti potrei fare tutto
>da script visto che tramite ajax con un client script si arriva
>anche alla session.



Come come? Scusa? Non capisco!

Cioè? Dal client accedi alla session sul server? Bhè, ottieni dati tuoi! Mica di altri! Poi... Tutto ciò che c'è in ajax è rifattibile con javascript! Che problema c'è? Solo con ajax è già fatto! Non c'è mica niente di "UFO" in ajax, sono solo istruzioni javascript e .net framework già scritte che posso essere usate gratis! Che tra l'altro chiunque può riscrivere. Pensi che altrimenti zio bill ci avrebbe date delle briciole dal suo tavolone, così, gratis? Sa benissimo che questa soluzione era già implementata da svariate persone a mano! Mettendo richieste

No, non condivido le asserzioni, mi spiace! Altre idee... Ti complichi la vita.

A questo punto devi Prendere l'evento onchangeindex (o simile) della drop down.

Fai una httprequest su una seconda pagina aspx.

Aspetti il risultato

Operi sulla pagina a seconda del risultato.

FAI QUELLO CHE FA AJAX A MANO!

Secondo me è una follia.

Per la guida ho fatto un post poco fa. Te lo rigiro tra un secondo. Tempo di cercarlo.

>quindi ipotesi scartata...
>niente ajax e niente soluzioni semplici come al solito. quanto
>voglio lavorare con una windows application. ma il capo ignorante
>pretende una web application che si comporti come un windows
>apllication, e io ci perdo la vista davanti al pc.

Ti capisco perfettamente. A questo putno, tu digli che ajax, la fa diventare davvero una windows app! Altrimenti ti rifiuti di riscrivere un framework che GIA' ESISTE!

>a me non viene in mente nessun modo per intercettare solo quando
>lascio quella pagina per andare su un'altra e poter svuotare
>la sessione, a te?

Cmq, ti capisco! E' uguals per me... Dicevo, cmq... Tutti gli oggetti che variano, a questo punto, li devi variare tramite javascript e le httprequest di cui ti scriverò tra poco.

Simuli una sorta di threading client, insomma...

Lato server, ti fai una pagina che risponde alle tue richieste.

Occhio!

La risposta, generala sempre in questo modo!

Response.clear
response.write(risposta)
response.end!

Altrimenti ti toca leggerti tutto l'html!

Good luck!

pozzoli.samuele Profilo | Senior Member



Che p...a che sono!

E' il 4° post di questa discussione...

Eh... la vecchiaia, che scherzi fa!

Dicevamo... torniamo a quella soluzione ma solo per aggiornare gli oggetti, e, a questo punto, alla chiusura del body.

Per me cmq è follia!

amstrad Profilo | Junior Member

concordo con te sul fattore follia, perchè in questo caso sarebbe piu semplice e diretto uccidere gli oggetti a ogni uscita agendo sui link di uscita della pagina come scrivevi all'inizio.
cmq ti ringrazio per l'aiuto, ora vedo come posso aggirare il problema. sicuramente in uno dei modi suggeriti

pozzoli.samuele Profilo | Senior Member

Te ne do un altro. Usa ajax senza dirlo a chi decide...

amstrad Profilo | Junior Member

mi viene in mente una possibile soluzione,
ho modo in javascript di intercettare il nome pagina che si sta aprendo in modo tale da verificare nella funzione che apre la pagina cancellaSessione.aspx se la pagina chiamata è uguale alla chiamante e inserirlo in un blocco if in modo di far partire la procedira di cancellazione solo se il nome pagina è differente?

il mio cervello vaga per infinite lande quando si tratta di aggirare problemi per i quali non vogliono sentire che non c'è soluzione se non facendo in un modo che a loro non piace

pozzoli.samuele Profilo | Senior Member

MNa la chiamante di cancellasessione.aspx, è quella che la apre, sempre e comunque, sia che sia un postback che che non lo sia.... Non ce la fai.

Se ho capito quello che vuoi fare...

Hai l'evento if ispostback! Ma.... Come fai a sapere prima di inviare una pagina se quello è un postback o una redirezione su un'altra pagina?

E' impossibile! Solo il server lo saprà!

A meno di mettere sull'on-load di ogni pagina, o se sei fortunato della master, che se l'http-referrer è quella pagina, fai un session.clear.

Problema evidente: Se il client ti chiude la pagina?



D'ho!

Mi sa che devi rifugiarti in un http-request... Cioè, devi pulire la sessione solo se la pagina viene chiusa in via definitiva.

Per quanto riguarda gli ogetti che possono essere aggiornati ti crei una sorta di update panel "virtuale" che aggiorna gli oggetti tramite javascript...

Per quanto riesca a ragionarci io, è l'unica... Perchè anche li... Anche se riesci ad individuare il chiamante... La popup, rileva sempre la chiusura della pagina. Sia che sia un postback che sia una submit...

Inoltre... Il popup, vien sempre chiamato dalla stessa pagina. Comunque...

Puoi passare un parametro se è un postback... Questo si, ma quanti postback devi fare? Impossibile saperlo prima...

E poi... ti fai una funzione Javascript che accede alla session, tramite un httprequest (E ci metti veramente un decimo di secondo, son 4 istruzioni) e fai vedere ai tuoi capi che il primo picchio che passa.... può distruggere la realtà. La differenza è che costruire un accrocchio, Può generare bachi. Usando ajax, invece... Almeno qualcuno l'ha testato e dovrebbe essere un po' più sicuro...
Comunque, sempre ed in ogni caso, un client che interroga un server, deve avere un pezzo di codice che risponde dall'altra parte! La differenza è che con ajax, il codice che interroga il server, non è visibile... Guarda un po'...
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