【问题标题】:Run in asp.net app javascript code before response window download在响应窗口下载之前在 asp.net 应用程序 javascript 代码中运行
【发布时间】:2016-08-23 12:25:36
【问题描述】:

我开发了一个页面,当用户单击按钮时,在查询后可以下载 xlsx。 查询可能需要几秒钟,所以我想在操作期间隐藏按钮。

我知道这通常是一个简单的操作,通过按钮上的js:

<asp:ImageButton id="Bt" OnClientClick=" this.style.display = 'none';  />

脚本结束时的服务器端:

Bt.Style.Add("display", "inline");

但为了制作 xslx,我使用以下代码:

response = System.Web.HttpContext.Current.Response;
response.ClearContent();
response.Clear();
response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
response.AddHeader("Content-Disposition", "attachment; filename=name.xlsx");
response.TransmitFile(file_path);
response.Flush();
response.End();

清除响应上下文不允许我在脚本中运行其他 javascript 代码(它只是不起作用),所以我不知道如何将按钮的可见性设置为内联。

【问题讨论】:

  • 你是对的,它不会在服务器端工作,因为你向客户端提供了完全不同的响应——发送文件,而不是刷新页面。但同样,客户端无法检测下载何时完成(出于基本相同的原因 - 它是您实际页面上下文之外的完全独立的请求)。很多人都试图解决这个问题:google.co.uk/… 如您所见,没有可靠或简单的解决方案。

标签: javascript asp.net response httpresponse


【解决方案1】:

ADyson 在评论中的建议是对的。没有舒适的解决方案来解决这个问题。 顺便说一句,我做了一个技巧来解决这个问题,这有点蹩脚,但它很容易而且很有效。如果它对某人有用,我还是发布它。

try
{
   ...
}
catch
{
   ...
}
finally
{
  script = "document.getElementById('Bt').style.display = 'inline';";
  if(add_click)
     script += "document.getElementById('Bt_Download_Hidden').click();";

 Page.ClientScript.RegisterStartupScript(typeof(System.Web.UI.Page), "alert", @"
     <script type=""text/javascript"">
       " + script + @"
     </script>");
        }

在我完成所有工作之前,我只是准备 xlsx 并将结果路径存储在会话变量中。 正如您在 finally 子句中看到的那样,我运行一个始终将按钮的可见性设置回内联的脚本,最后,如果一切正常,它会单击一个隐藏按钮。在第二个按钮中,我输入了下载文件的代码。 所以我强制冲洗操作是最后一个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-10
    • 2013-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多