下载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);
}
}
基本上;你不能这样做。一次只能向客户端发送一个响应。它要么是文件更新,要么是页面更新,你不能同时拥有两者。 你还有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。