下载excel / word功能后,程序控制消失并丢失

本文关键字:消失 程序控制 excel word 功能 下载 | 更新日期: 2024-11-07 07:06:57

我有一个C#程序,它将用于下载生成的word文档。此外,生成后,UI 中的"沙漏"属性必须重置为默认值。为此,我使用 scriptmanager 调用一个 javascript 函数,该函数只有在语句出现在最后时才能执行。不幸的是,在有下载word文档的代码之前的步骤。当它发生时,程序会丢失,永远不会返回并执行脚本管理器所在的程序的其余部分以停止沙漏。将脚本管理器放在下载代码之前也无济于事。我在这个特殊的问题上遭受了很多痛苦。请帮忙,谢谢!!

下面是代码。

private void DownloadFile(string filename)
{
        System.IO.FileInfo file = new System.IO.FileInfo(filename);
        if (file.Exists)
        {
            HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment; filename=" + file.FullName);
            HttpContext.Current.Response.AddHeader("Content-Length", file.Length.ToString());
            HttpContext.Current.Response.ContentType = "Application/msword";
            HttpContext.Current.Response.WriteFile(file.FullName);
            //HttpContext.Current.Response.Flush();
            HttpContext.Current.Response.End();
            ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), "script", "stopHourglass()", true);
        }
}

下载excel / word功能后,程序控制消失并丢失

基本上;你不能这样做。一次只能向客户端发送一个响应。它要么是文件更新,要么是页面更新,你不能同时拥有两者。 你还有response.end,告诉脚本有效地停止。

我建议你放下javascript来显示沙漏

当调用

Response.End()时,您将不再从服务器获得响应,因为Response.End()本质上会抛出异常,并且您对此无能为力。您需要做的是切换顺序。准备好下载文件后,使用 ScriptManager 注册使用特定参数__doPostBack的脚本。在Page_Load稍后,您将阅读该参数并相应地执行下载。同时,在ScriptManager.RegisterStartupScript(或ScriptManager.RegisterClientScriptBlock)之后,做你的清理逻辑。

代码将如下所示:

ScriptManager.RegisterClientScriptBlock(this.Page, this.GetType(), "DownloadFileKey", "__doPostBack('', '" + YourArgumentConstStr + "');", true);
// You clean up code here.

在Page_Load:

if (Request["__EVENTARGUMENT"] != null && Request["__EVENTARGUMENT"] == YourArgumentConstStr)
   // Download the file here.

现在你的下一个问题是:这是"最整洁"的可能方法吗?基本上,如果您坚持将所有内容都放在同一页面上,那么是的,您必须实施这样的解决方法。但是,总体趋势是打开另一个仅进行下载的选项卡(新页面)。一个流行的例子是Microsoft网站。在此处查看如何下载 .NET Framework。