【问题标题】:Program control goes out and lost after downloading excel/word functionality下载excel/word功能后程序控制消失丢失
【发布时间】:2015-03-10 09:35:19
【问题描述】:

我有一个 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);
        }
}

【问题讨论】:

  • 您是否在相关代码块中将trycatch 可能是exception?异常可能会被抑制,具体取决于调用上下文...

标签: c# asp.net scriptmanager


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    当调用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

    【讨论】:

    • @yazanpro ..这似乎是个好主意,我尝试过同样的方法,我首先调用脚本管理器,它调用我编写代码如下的javascript函数。,函数doPostBack(消息){ document.body.style.cursor = 'auto'; alert("再次调用页面加载!!"); __doPostBack('Page_Load', message); }
    • 这个函数被调用了,我也在页面加载中保留了断点,但是发生的情况是,当 _dopostback 行被执行时,它永远不会进入该页面的页面加载,但页面会被刷新。 .真的很奇怪页面如何刷新但无法在页面加载中使用断点捕获事件...对此有什么想法吗?
    • 除非您有更新面板,否则不应在 __doPostBack ( no 'Page_Load') 中传递第一个参数,然后您可以将其 id 作为第一个参数传递以生成部分回帖。坚持我提供的示例代码,看看它是否有效。然后,您可以根据需要对其进行调整。
    猜你喜欢
    • 2021-01-04
    • 1970-01-01
    • 2015-01-19
    • 1970-01-01
    • 1970-01-01
    • 2017-02-12
    • 1970-01-01
    • 1970-01-01
    • 2017-02-28
    相关资源
    最近更新 更多