2010-12-28 9 views
0

Ich habe eine Schaltfläche, die ein Click-Ereignis aufruft, um ein Bild herunterzuladen. In meinem Klick-Ereignis habe ich etwas Code, um meine Anzeige zu ändern, wenn der Speichern-Dialog erscheint. Das Problem, das ich habe, ist, dass wenn der Dialog auftaucht, die Ausführung der vorherigen Codezeile gestoppt wird. Wie kann ich überprüfen, ob mein Code vor dem Aufruf der Funktion ausgeführt wurde?Response.WriteFile Beenden der vorherigen Anfrage

Hier ist meine Schaltfläche Ereignishandler und Funktion:

protected void btnSave_Click(object sender, EventArgs e) 
{ 
    var _title   = txtTitle.Text; 
    txtTitle.Text  = string.Empty; 
    txtDescription.Text = string.Empty; 

    ChangeDisplay(); 

    if (Request.Browser.Browser == "IE") 
     lblSnapShot.Visible = (lblSnapShot.Visible) ? false : true; 

    SaveSnapShot(_title); 
} 

void SaveSnapShot(string _title) 
{ 
    try 
    { 
     FileInfo _fileToDownload = new FileInfo(_path); 
     Response.Clear(); 
     Response.ContentType = "image/png"; 
     Response.AppendHeader("Content-Disposition", "attachment; filename=\"" + _title + ".png\""); 
     Response.WriteFile(_fileToDownload.FullName); 

     HttpContext.Current.ApplicationInstance.CompleteRequest(); 
    } 
    catch (System.Exception ex) 
    { 
     ChangeDisplay(); 

     if (Request.Browser.Browser == "IE") 
      lblSnapShot.Visible = (lblSnapShot.Visible) ? false : true; 

     Response.Write("SAVE FAILED \n Error: " + ex.Message); 
    } 
} 
+0

das einzige "response.write" ich sehe ist, wenn die "Speichern fehlgeschlagen". Kannst du deine Frage etwas mehr erklären? –

+0

@rockinthesixstring Ich entschuldige mich für die Unbestimmtheit der Frage. Der Titel meiner Frage sollte Response.WriteFile sein. Im Click-Ereignis der gesamte Code vor dem Funktionsaufruf SaveSnapShot(); wird nicht ausgeführt. Es scheint, dass die Antwort.WriteFile die Verarbeitung dieses Codes beendet. Wenn ich den Funktionsaufruf auskommentiere, wird der gesamte Code im click-Ereignis ausgeführt. – BDonald

+0

und Response.End() hat das gleiche Problem wie CompleteRequest()? – hova

Antwort

2

Response.WriteFile nicht die Verarbeitung des anderen Code zu stoppen (das Code kommt, bevor Sie selbst Writefile aufrufen, so wie es könnte?)

Ihre SaveSnapshot-Methode sendet jedoch anstelle der üblichen HTML-Antwort ein Bild an den Browser zurück. Für jede Anfrage vom Browser können Sie nur eine Antwort senden - Sie können keine Bilddatei zurücksenden und HTML gleichzeitig aktualisieren.

+0

Ich dachte das gleiche, aber wenn ich den Anruf auskommentieren, funktioniert der andere Code gut. – BDonald

+0

korrekt. Normalerweise generiert und sendet ASP.NET HTML zurück. Wenn Sie Response.WriteFile aufrufen, überschreiben Sie dies und weisen ASP.NET an, stattdessen eine Datei zurückzusenden. Sie müssen den Browser des Benutzers (über Javascript) aufrufen, um eine separate Anfrage an Ihre Web-App zu senden, und in der separaten Anfrage werden Sie Response.WriteFile aufrufen. –

+0

Vielen Dank. Können Sie mir ein Beispiel für eine separate Anfrage geben? Ich hoffe, ich stelle keine dumme Frage. Ich kämpfe seit einiger Zeit damit und mein Gehirn hat gerade eine niedrige Funktionsrate. – BDonald

Verwandte Themen