Intercettare il metodo httpapplication.endrequest

martedì 04 dicembre 2007 - 10.11

amstrad Profilo | Junior Member

Ciao a tutti :)
Ho letto da qualche parte che le paroline magiche "this.Page.Response.End();" scatenano l'evento endrequest.
Il mio problema è che ho una pagina che alla pressione di un pulsante genera un file xml e lo scrive nel response della pagina e poi propone al client di aprirlo o scaricarlo.

ora essendo una quantità di dati notevoli il server impiega un pò per fare questo giretto, quindi volevo trovare il modo per visualizzare un waiting all'utente.

fino ad ora o tentato mettendo un pannello nascosto con una scritta attendere prego e una gif animata inizialmente nascosto, che viene visualizzato con uno script js invocato dal clientclick del pulsante, il risultato è ovviamente che visualizzo il pannello, la gif si blocca appena inizio ad eseguire il codice che scrive nella response e poi però concludendo il metodo con response.end() non ho modo per rinascondere nuovamente il pannello del waiting.

Avevo pensato che potrebbe essermi utile l'end request, ma sono su una zona che per me è totalmente inesplorata, avete suggerimenti e illuminazioni per me?

grazie in anticipo

amelix Profilo | Expert

Io ho risolto "aggirando" il problema con on-focus-lost (javascript).
Funziona xchè quando parte il download perdi il focus della pagina etc... etc...

Cmq la tua idea di "intercettare" il response end (lato server) x fare quello che ti serve non può funzionare e anzi rischi di manomettere l'output.



Andrea - http://www.MelisWeb.eu/

amstrad Profilo | Junior Member

perdona la mia ignoranza l' on-focus-lost è un'evento di che tipo, ossia come implemento il codice per nascondere il pannello se è quello che devo fare.
ho provato a mettere accanto a body nell'aspx onfocusLost="showPanel()" ma non funziona
e a parte questo, ti viene in mente un modo per non far fermare la gif mentre eseguo il codice

amelix Profilo | Expert

>perdona la mia ignoranza l' on-focus-lost è un'evento di che
>tipo, ossia come implemento il codice per nascondere il pannello
>se è quello che devo fare
l'on-focus-lost (nome corretto onblur) è un evento JS.

Io uso una cosa del genere:
function showLoading() { var width = document.body.offsetWidth; var height = document.body.offsetHeight; var top = 0; var left = 0; var pnlLoading = document.getElementById('ctl00_ctl00_ContentPage_pnlLoading'); pnlLoading.style.width = width + 'px'; pnlLoading.style.height = height + 'px'; pnlLoading.style.top = top + 'px'; pnlLoading.style.left = left + 'px'; pnlLoading.style.visibility = 'visible'; pnlLoading.style.cursor = 'wait'; var imgLoading = document.getElementById('ctl00_ctl00_ContentPage_imgLoading'); imgLoading.style.left = ((width - 130) / 2) + 'px'; imgLoading.style.top = '150px'; imgLoading.style.visibility = 'visible'; var imgChiudi = document.getElementById('ctl00_ctl00_ContentPage_imgChiudi'); imgChiudi.style.visibility = 'visible'; var selects = document.getElementsByTagName('select'); for (i = 0; i < selects.length; i++) selects[i].style.visibility = 'hidden'; //Serve per ovviare al problema del back e il loading. //Se il browser è mozilla... Altrimenti... if (document.addEventListener) { //Firefox document.addEventListener('DOMContentLoaded', hideLoading, false); document.addEventListener('blur', hideLoading, false); } else if (document.attachEvent) { //Internet Explorer var pnlFocus = document.getElementById('ctl00_ctl00_ContentPage_pnlFocus'); pnlFocus.attachEvent('onload', hideLoading); pnlFocus.attachEvent('onblur', hideLoading); pnlFocus.style.width = (width - 10) + 'px'; pnlFocus.style.height = (height - 10)+ 'px'; pnlFocus.style.top = (top + 10) + 'px'; pnlFocus.style.left = (left + 10) + 'px'; pnlFocus.style.visibility = 'visible'; pnlFocus.style.cursor = 'wait'; pnlFocus.focus(); } else { document.onload = new Function('hideLoading(e);'); document.onblur = new Function('hideLoading(e);'); } } function hideLoading(e) { var pnlLoading = document.getElementById('ctl00_ctl00_ContentPage_pnlLoading'); pnlLoading.style.visibility = 'hidden'; pnlLoading.style.cursor = 'default'; var imgLoading = document.getElementById('ctl00_ctl00_ContentPage_imgLoading'); imgLoading.style.visibility = 'hidden'; var imgChiudi = document.getElementById('ctl00_ctl00_ContentPage_imgChiudi'); imgChiudi.style.visibility = 'hidden'; var selects = document.getElementsByTagName('select'); for (i = 0; i < selects.length; i++) selects[i].style.visibility = 'visible'; }

Quando premi il pulsante di download, come fai adesso, lanci la function JS showLoading().
Ovviamente va sistemata secondo le tue esigenze...

Andrea - http://www.MelisWeb.eu/

amstrad Profilo | Junior Member

danke, ottima soluzione

amelix Profilo | Expert

>danke, ottima soluzione
Grazie mille! È stato un piacere.
Alla prossima.
Andrea - http://www.MelisWeb.eu/

amstrad Profilo | Junior Member

visto che sei stato così repentino nel trovare una soluzione, c'è modo di ovviare al fatto che la gif animata che meto sul panel del wait non si blocchi?

amelix Profilo | Expert

Purtroppo è un problema che non ho ancora risolto...
Ho provato anche con un file flash... ma niente...

Cmq non ho ancora perso la speranza!
Se trovo qualche cosa ti faccio sapere... se la trovi tu... fammi sapere!

Andrea - http://www.MelisWeb.eu/

amstrad Profilo | Junior Member

carissimo io stavo tentando questa strada

function animatingWait(countImage, imagePrefix, ImageSuffix)
{
for(var i = 0; i < countImage; i++)
{
pausecomp(700)
img.src = imagePrefix + i + ImageSuffix;
}
}
function pausecomp(millis)
{
var date = new Date();
var curDate = null;

do { curDate = new Date(); }
while(curDate-date < millis);
}

ossia dalla funzione che mostra il panel wait, faccio richiamare la funzione animatingwait() che sostituisce il src dell'immagine creando un'animazione, però così lo fa una volta e poi smette, non sò se è fattibile e ho scarse conoscenze in materia però mi era stato detto di riferire nel caso trovassi qualcosa e io ho riferito.

amelix Profilo | Expert

Grandissimo!
Funziona... basta solo fare enne immagini per simulare l'animazione...
E una piccola modifica al tuo codice JS

function animatingWait(countImage, imagePrefix, ImageSuffix)
{
for(; true ; )
{
for(var i = 0; i < countImage; i++)
{
pausecomp(700)
img.src = imagePrefix + i + ImageSuffix;
}
}

Grazie!
Andrea - http://www.MelisWeb.eu/

amstrad Profilo | Junior Member

Lieto di aver fatto qualcosa di costruttivo
anche se non ci giurerei, stavo provando ora la modifica e mi si blocca tutto, per curiosità, tu l'hai provato, e in caso di risposta positiva, dove la richiami la funzione animatingWait()?

amelix Profilo | Expert

Alla fine del metodo showLoading()
Bisogna stopparla alla fine...

Questo lo devo ancora provare...
Andrea - http://www.MelisWeb.eu/

amstrad Profilo | Junior Member

qundo ci provi fammi sapere se ti funziona correttamente che sono curioso, nel frattempo ci provo io ^^
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