2016-06-07 22 views
0

So arbeite ich mit diesem Formular, das am Ende ein Word-Dokument für den Benutzer zum Download generiert, löst einige E-Mails aus und zeigt dann ein erfolgreiches Panel für den Benutzer. Das Problem, das ich habe, ist, dass die Visible Flags nicht geändert werden, wenn ich die downloadWordFile() -Methode aufrufen. Gibt es etwas in dieser Methode, die meine Fähigkeit beeinträchtigen würde, die Sichtbarkeit von ASP-Panels zu ändern? Ich habe versucht, fast jeden Teil davon zu entfernen, um zu sehen, wo das Problem auftaucht und ich war nicht in der Lage, Kopf oder Zahl davon zu machen. Alles andere funktioniert gut, es ist nur diese Methode, die das Problem verursacht. Vielen Dank im Voraus für Ihre Hilfe!Das Erstellen eines Word-Dokuments in C# hindert mich daran, Panels in ASP sichtbar zu machen, was läuft falsch?

protected void btnSubmit_Click(object sender, EventArgs e) 
     { 
      pnlForm.Visible = false; 
      pnlSuccess.Visible = true; 
      email(); 
      adminEmail(); 
      downloadWordFile(); 
     } 

protected void downloadWordFile(){ 
     Response.ContentType = "application/msword"; 
     Response.ContentEncoding = System.Text.UnicodeEncoding.UTF8; 
     Response.Charset = "UTF-8"; 

     Response.Write("<html xmlns:o='urn:schemas-microsoft-com:office:office' xmlns:w='urn:schemas-microsoft-com:office:word' xmlns='http://www.w3.org/TR/REC-html40'>"); 
     Response.Write("<head>"); 
     Response.Write("<META HTTP-EQUIV=\"Content-Type\" CONTENT=\"\"text/html; charset=UTF-8\"\">"); 
     Response.Write("<meta name=ProgId content=Word.Document>"); 
     Response.Write("</head>"); 
     Response.Write("<body>"); 
     Response.Write("<div class=Section2>"); 

     Response.Write(buildForm()); 

     Response.Write("</body>"); 
     Response.Write("</html>"); 
     Response.AppendHeader("Content-Disposition", "attachment; filename=" + "Generic.doc"); 
     HttpContext.Current.Response.Flush(); 
    } 

EDIT 1: Ich ging einen anderen Weg vollständig. Anstatt zu versuchen, die Panels zu wechseln, E-Mails zu generieren und Word-Dateien auf einmal zu generieren, habe ich die Übermittlungsschaltfläche zwischen den Panels wechseln lassen, und das Erfolgsfenster zeigt nun eine Vorschau des Word-Dokuments, das heruntergeladen werden soll, und bietet dem Benutzer die Möglichkeit Änderungen vornehmen Es gibt eine Download-Schaltfläche im Erfolgsfenster, die die E-Mails generiert und das Word-Dokument herunterlädt. Dies erforderte minimale Änderungen an der Art, wie der Code bereits eingerichtet war, und löste ein weiteres Problem, das bei der E-Mail-Generierung auftrat.

Antwort

2

Eine Antwort kann nur eine Sache sein. Sie können nicht mit dem Seiteninhalt und einer Datei antworten. Sie legen die Antwort auf eine Datei fest, sodass der Browser die Antwort verarbeitet.

Ich würde diese Situation durch den Aufruf einer JavaScript-Funktion im Click-Ereignis der Schaltfläche behandeln, die die Datei über ein IFrame herunterlädt.

Zuerst benötigen Sie eine "Download-Datei" -Seite. Im OnLoad Ereignis dieser Seite können Sie email(); nennen, adminEmail(); und downloadWordFile();

Der Handler Click-Ereignis JavaScript würde wie folgt aussehen.

function DownloadFile() { 
    var downloadFrame = document.createElement("IFRAME"); 

    if (downloadFrame != null) { 
     downloadFrame.setAttribute("src", 'DownloadFile.aspx'); 
     downloadFrame.style.width = "0px"; 
     downloadFrame.style.height = "0px"; 
     document.body.appendChild(downloadFrame); 

     //Set the visibility of pnlForm and pnlSuccess 
    } 
} 

EDIT:
Per Ihren Kommentar, ich habe das gleiche zu tun. Ich löste es, indem ich das Formular als normal passte und die Formularwerte in einen Abfrage-String zusammenfügte. Verwenden Sie dann ScriptManager.RegisterStartupScript, um ein Skript hinzuzufügen, das die Funktion DownloadFile() aufruft, wenn die Seite geladen wird. Die DownloadFile()-Funktion nimmt die Abfragezeichenfolge als Parameter und die DownloadFile.aspx-Seite verwendet sie, um die Formulardaten abzurufen.

So würde der Click-Event-Handler wie folgt aktualisiert werden.

function DownloadFile(queryString) { 
    var downloadFrame = document.createElement("IFRAME"); 

    if (downloadFrame != null) { 
     downloadFrame.setAttribute("src", 'DownloadFile.aspx' + queryString); 
     downloadFrame.style.width = "0px"; 
     downloadFrame.style.height = "0px"; 
     document.body.appendChild(downloadFrame); 

     //Set the visibility of pnlForm and pnlSuccess 
    } 
} 
+0

Ich denke, ich kann das als Sprungpunkt verwenden, danke! Eines der Probleme mit dieser Methode ist, dass das Word-Dokument, das heruntergeladen wird, aus dem Inhalt des Formulars generiert wird. Ich muss also alle Informationen aus dem Formular auf die neue Seite übertragen, sonst bekomme ich eine Menge "txtTitle" existiert in diesem Zusammenhang nicht "Tippfehler. –

+0

Als Antwort auf Ihre Bearbeitung: Da es sich um mehr als 60 Felder handelt, anstatt Abfragezeichenfolgen zu verwenden, gibt es einen Grund, warum ich kein Array zum Speichern der 60 Felder verwenden und dann aus dem Array lesen könnte, anstatt a zu verwenden queryString, was bei dieser Größe ziemlich unhandlich würde? –

+0

Das ist eine große Form. Ich könnte erwägen, den lokalen Speicher des Browsers zu verwenden, um die Formulardaten beizubehalten. Lokaler Speicher ist eine HTML5-Spezifikation, sodass die Browserkompatibilität möglicherweise ein Problem darstellt. –