在 C# 中构建 Word 文档使我无法在 ASP 中显示面板,这是怎么回事?

Building a Word Document in C# is stopping me from making panels visible in ASP, what's going wrong?

所以我正在使用这个表单,它最后会生成一个 Word 文档供用户下载,发送一些电子邮件,然后为用户显示一个成功面板。我遇到的问题是,每当我调用 downloadWordFile() 方法时,.Visible 标志最终都不会改变。该方法中有什么东西会干扰我更改 ASP 面板可见性的能力吗?我已经尝试删除其中的几乎所有部分以查看问题出现的位置,但我无法弄清它的正面或反面。其他一切正常,只是这种方法导致了问题。预先感谢您的帮助!

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

编辑 1:我最终选择了完全不同的路线。我没有尝试一次性切换面板、生成电子邮件和生成 word 文件,而是让提交按钮切换面板,成功面板现在显示要下载的 word 文档的预览,并为用户提供机会做出改变。成功面板上有一个下载按钮,可以生成电子邮件并下载 word 文档。这需要对代码的设置方式进行最小的更改,并解决了我在生成电子邮件时遇到的另一个问题。

一个回应只能是一件事。您无法使用页面内容和文件进行响应。您正在设置对文件的响应,以便浏览器处理响应。

我会通过在按钮的单击事件中调用一个 JavaScript 函数来处理这种情况,该函数通过 IFrame 下载文件。

首先您需要一个 "download file" 页面。在该页面的 OnLoad 事件中,您可以调用 email();adminEmail();downloadWordFile();

JavaScript 单击事件处理程序看起来像这样。

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
    }
}

编辑:
根据您的评论,我不得不做同样的事情。我通过正常发布表单并将表单值组装到查询字符串中来解决它。然后使用 ScriptManager.RegisterStartupScript 添加一个脚本,在页面加载时调用 DownloadFile() 函数。 DownloadFile() 函数将查询字符串作为参数,DownloadFile.aspx 页面使用它来获取表单数据。

所以点击事件处理程序将像这样更新。

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
    }
}