2012-10-19 7 views
5

Nel mio sito Web di Asp.net ho un modulo in cui gli utenti selezionano varie opzioni e tali opzioni vengono reinviate in un postback che genera un PDF report e invia il file indietro per l'utente per il download tramite il seguente codice:Come evitare di premere il pulsante fino a quando la richiesta di modulo non viene completata quando la richiesta di modulo causa il download di un file

protected void btnTopGenReport_Click(object sender, EventArgs e) 
    { 
     var stream = new PodMainReportGenerator().GenerateReport(GetReportParameters()); 

     var bytes = stream.ToArray(); 
     stream.Close(); 

     // Set the content headers 
     Response.Clear(); 
     Response.Buffer = true; 
     Response.ContentType = "application/pdf"; 
     Response.AddHeader("Content-Disposition", "attachment;filename=testReport.pdf"); 
     Response.AddHeader("Content-Length", bytes.Length.ToString()); 

     Response.BinaryWrite(bytes); 

     Response.End(); 
    } 

il problema è questo rapporto può prendere un buon 10 secondi circa per generare a causa della quantità di dati e di elaborazione necessaria, ma io non voglio che le persone diventino impazienti e facciano clic ripetutamente sul pulsante.

In una pagina normale aggiungerei javascript per disabilitare i pulsanti al clic. Funziona perché quando il postback è completo il server ritorna con i pulsanti del modulo riabilitati. Tuttavia, poiché la risposta del modulo non è una pagina HTML ma un file scaricato, che non so come rilevare.

In sostanza, come disattivare i pulsanti del modulo ma riattivarli una volta ottenuta la risposta dal server (e il trasferimento del file http è avviato)?

+0

prevously chiesto http://stackoverflow.com/questions/6137172/how-do-i-prevent-users-clicking-a-button-twice – David

+0

myButton.Enabled = false? – LightStriker

+0

Questa domanda risponde solo a metà del mio problema e non risponde come riattivare il pulsante. Anche myButton.Enabled non funzionerà perché la risposta di Asp.Net non è re-rendering dell'HT dal momento che sta solo restituendo il contenuto del file – KallDrexx

risposta

0

// Per disabilitare il pulsante, scrivere il codice riportato di seguito al caricamento della pagina.

System.Text.StringBuilder sbValid = new System.Text.StringBuilder(); 
    sbValid.Append("if (typeof(Page_ClientValidate) == 'function') { "); 
    sbValid.Append("if (Page_ClientValidate() == false) { return false; }} "); 
    sbValid.Append("this.value = 'Saving..';"); 
    sbValid.Append("this.className = 'Save_Button_Active';"); 
    sbValid.Append("this.disabled = true;"); 
    sbValid.Append(this.Page.GetPostBackEventReference(this.btnName)); 
    sbValid.Append(";"); 
    this.btnName.Attributes.Add("onclick", sbValid.ToString()); 
    this.btnName.Attributes.Add("onclick", "this.className = 'Cancel_Button_Active';"); 

si può anche fare riferimento al seguente link per ulteriori informazioni:

http://bytes.com/topic/c-sharp/answers/887893-disabled-button-calling-even-handler-button-click

Button disable function after clicking on it

Disable the asp button after first click because it save multiple records in slow connection

+0

è possibile rimuovere gli attributi this.classname mentre sto dando il nome della classe per gli stili. Grazie. –

+0

Tuttavia, ciò non risolve la seconda parte del mio problema, che riattiva il pulsante dopo che è stata ricevuta una risposta. – KallDrexx

2

Cercando di pensare fuori dagli schemi qui. Invece di disabilitare/abilitare il pulsante di invio, è possibile impostare una variabile a livello di sessione che indica che il report è in esecuzione. Se l'utente fa clic di nuovo sul pulsante di invio mentre viene elaborata una richiesta precedente, non avviare una nuova procedura.

Per una migliore esperienza di interfaccia utente, è possibile che venga attivata una chiamata AJAX prima che il modulo venga inviato per verificare se è in esecuzione un processo precedente. In tal caso, è possibile annullare l'invio del modulo e visualizzare un messaggio sulla falsariga di "La richiesta precedente è ancora in fase di elaborazione".

Pensieri?

+0

L'unico problema potenziale che vedo è che se il browser ignora la risposta con il download del file se l'utente ha già ricaricato la pagina a causa della pressione del pulsante (attivando così un postback non scaricabile) – KallDrexx

+0

Non sono sicuro di cosa intendi, mi dispiace.Ma detto questo, penso che la soluzione pubblicata da @jvenema sia la soluzione migliore. Sembra che faccia esattamente quello che stavi cercando. –

+0

sì ho scritto male quel commento. Immagino che cosa stavo pensando è che non so come i browser gestiscono la situazione in cui si fa clic su un potenziale collegamento di download, quindi prima che la risposta entri, passa a un'altra pagina. – KallDrexx

Problemi correlati