C# 在C中构建Word文档会阻止我在ASP中显示面板,什么';出什么事了?

C# 在C中构建Word文档会阻止我在ASP中显示面板,什么';出什么事了?,c#,asp.net,ms-word,panel,visible,C#,Asp.net,Ms Word,Panel,Visible,因此,我正在使用这个表单,它在最后生成一个Word文档供用户下载,发出一些电子邮件,然后为用户显示一个成功面板。我遇到的问题是,每当我调用downloadWordFile()方法时,.Visible标志最终不会改变。该方法中是否有什么东西会影响我更改ASP面板可见性的能力?我已经试着删除了几乎每一个部分,看看这个问题是从哪里冒出来的,我还没有弄清楚它的头绪。其他一切都很好,只是这个方法导致了问题。提前感谢您的帮助 protected void btnSubmit_Click(object sen

因此,我正在使用这个表单,它在最后生成一个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();
    }
protectedvoid btnSubmit\u单击(对象发送方,事件参数e)
{
pnlForm.Visible=false;
pnlSuccess.Visible=true;
电子邮件();
adminEmail();
下载wordfile();
}
受保护的void downloadWordFile(){
Response.ContentType=“应用程序/msword”;
Response.ContentEncoding=System.Text.unicodeincoding.UTF8;
响应。Charset=“UTF-8”;
回答。写(“”);
回答。写(“”);
回答。写(“”);
回答。写(“”);
回答。写(“”);
回答。写(“”);
回答。写(“”);
Write(buildForm());
回答。写(“”);
回答。写(“”);
Response.AppendHeader(“内容处置”、“附件;文件名=“+”Generic.doc”);
HttpContext.Current.Response.Flush();
}

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

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

我将通过在按钮的click事件中调用JavaScript函数来处理这种情况,该事件通过IFrame下载文件

首先,您需要一个“下载文件”页面。在该页面的
OnLoad
事件中,您可以调用
email()
adminEmail()
下载wordfile()

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

因此,单击事件处理程序将按如下方式更新

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

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

我将通过在按钮的click事件中调用JavaScript函数来处理这种情况,该事件通过IFrame下载文件

首先,您需要一个“下载文件”页面。在该页面的
OnLoad
事件中,您可以调用
email()
adminEmail()
下载wordfile()

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

因此,单击事件处理程序将按如下方式更新

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

我想我可以以此为出发点,谢谢!这种方法的一个问题是,下载的word文档是根据表单中输入的内容生成的,因此我必须将表单中的所有信息传递到新页面上,否则我将得到一堆“txtTitle在此上下文中不存在”类型错误,与其使用查询字符串,还有什么原因我不能使用数组存储60个字段,然后从数组中读取,而不是使用查询字符串,在这样的大小下,查询字符串会变得非常笨拙?这是一个很大的形式。我可能会考虑使用浏览器的本地存储来保存表单数据。本地存储是HTML5规范,因此浏览器兼容性可能是一个问题。如果使用阵列,在请求之间将阵列存储在哪里?我最终选择了完全不同的路径。我没有尝试一次性切换面板、生成电子邮件和生成word文件,而是让submit按钮切换面板,success面板现在显示要下载的word文档的预览,并为用户提供进行更改的机会。成功面板上有一个下载按钮,用于生成电子邮件并下载word文档。这需要对代码的设置方式进行最小的更改,并解决了我在生成电子邮件时遇到的另一个问题。我想我可以以此为出发点,谢谢!这种方法的一个问题是