我有一个C#程序,用于下载生成的word文档。此外,在生成之后,UI中的“Hour Glass”属性必须重置为默认值。为此,我使用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);
}
}
答案 0 :(得分:0)
基本上;你不能这样做。您一次只能向客户端发送一个响应。它既可以是文件更新,也可以是页面更新,您不能同时拥有这两者。你在那里也有response.end
,告诉剧本有效停止。
我建议您删除javascript以显示小时玻璃
答案 1 :(得分:0)
当调用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.
现在你的下一个问题是:这是“最可能”的方法吗?基本上,如果你坚持让所有东西都放在同一个页面上,那么是的,你必须实现这样的解决方法。但是,总的趋势是打开另一个仅进行下载的选项卡(新页面)。一个流行的例子是微软网站。检查如何下载.NET Framework here。