2012-10-19 11 views
5

W mojej witrynie webowej Asp.net mam formularz, w którym użytkownicy wybierają różne opcje, a te opcje są odsyłane w odświeżeniu, które generuje plik PDF raport i wysyła ten plik z powrotem do użytkownika do pobrania za pomocą następującego kodu:Jak zapobiegać naciśnięciu przycisku, dopóki żądanie formularza nie zostanie wypełnione, gdy żądanie formularza spowoduje pobranie pliku

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(); 
    } 

problemem jest to raport może potrwać dobre 10 lub tak sekund, aby wygenerować ze względu na ilość danych i przetwarzania wymagane, ale nie chcę, aby ludzie byli niecierpliwi i ciągle klikają przycisk.

Na normalnej stronie dodałbym javascript, aby wyłączyć przyciski po kliknięciu. Działa to, ponieważ po zakończeniu odświeżania serwera serwer wraca z przyciskami formularzy ponownie włączonymi. Jednak ponieważ odpowiedź formularza nie jest stroną HTML, ale pobranym plikiem, którego nie potrafię wykryć.

Zasadniczo, w jaki sposób wyłączyć przyciski formularza, ale ponownie włączyć je, gdy otrzymamy odpowiedź z serwera (i rozpocznie się transfer pliku http)?

+0

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

+0

myButton.Enabled = false? – LightStriker

+0

To pytanie odpowiada tylko połowie mojego problemu i nie odpowiada, w jaki sposób ponownie włączyć przycisk. Również myButton.Enabled nie działa, ponieważ odpowiedź Asp.Net nie powoduje ponownego renderowania kodu HTML, ponieważ właśnie zwraca zawartość pliku – KallDrexx

Odpowiedz

0

// Aby wyłączyć przycisk, wpisz poniższy kod podczas ładowania strony.

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';"); 

można również odnieść się do następujących linków, aby uzyskać więcej informacji:

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

możesz usunąć atrybuty this.classname, ponieważ nadaję nazwę klasy stylom. Dzięki. –

+0

To nie zajmuje się jednak w drugiej połowie mojego problemu, co oznacza ponowne włączenie przycisku po otrzymaniu odpowiedzi. – KallDrexx

2

staramy się myśleć nieszablonowo tutaj. Zamiast wyłączać/włączać przycisk przesyłania, być może możesz ustawić zmienną poziomu sesji wskazującą, że raport jest uruchomiony. Jeśli użytkownik ponownie kliknie przycisk przesyłania podczas przetwarzania poprzedniego żądania, nie rozpoczynaj nowego procesu.

Aby uzyskać lepsze wrażenia interfejsu użytkownika, można chcieć wywołać wywołanie AJAX przed przesłaniem formularza, aby sprawdzić, czy poprzedni proces jest uruchomiony. Jeśli tak, możesz anulować przesyłanie formularza i wyświetlić komunikat o następującej treści: "Twoje poprzednie żądanie jest nadal przetwarzane."

Myśli?

+0

Jedyny potencjalny problem, jaki widzę, to to, że przeglądarka zignoruje odpowiedź przy pobieraniu pliku, jeśli użytkownik przeładował już stronę ze względu na naciśnięcie przycisku (w ten sposób wywołanie zwrotne niezwiązane z pobieraniem) – KallDrexx

+0

Nie jestem pewien co masz na myśli, przepraszam.Ale biorąc to pod uwagę, myślę, że rozwiązanie opublikowane przez @jvenema jest lepszym rozwiązaniem. Wygląda na to, że robi dokładnie to, czego szukałeś. –

+0

Tak, źle sformułowałem ten komentarz. Domyślam się, że nie mam pojęcia, w jaki sposób przeglądarki radzą sobie z sytuacją, w której klikasz na potencjalny link do pobrania, a następnie zanim pojawi się odpowiedź, przejdź do następnej strony. – KallDrexx

Powiązane problemy