我有一个ASP.NET页面(使用ASP.NET AJAX和Telerik RAD组件),它提供了一个数据表和一个以csv格式下载数据的选项。
我有一个要求,一个按钮允许用户下载数据集。我已经建立了一个系统,根据中的解决方案,它几乎可以为我工作。
Response.Redirect to new window
我的ASPX如下:
<asp:Button ID="ExportCsvButton" runat="server" Text="Download to CSV/Excel"
OnClick="ExportCsvButton_Clicked" OnClientClick="aspnetForm.target = '_blank';" />
然后在我的exportcsvbutton的codebehind中,我执行如下操作:
byte[] csvBytes = someLongOperation();
Session[EXPORTED_SESSION_KEY] = csvBytes;
Response.Redirect("myexportpage.aspx", true);
最后,在我的“myexportpage”代码后面,我要做的是:
protected void Page_Load(object sender, EventArgs e)
{
Response.Clear();
Response.ClearHeaders();
Response.ClearContent();
Response.AppendHeader("content-disposition", "attachment; filename=" + "file.csv");
Response.ContentType = "text/csv";
Response.AddHeader("Pragma", "public");
Response.BinaryWrite(Session[OtherPage.EXPORTED_SESSION_KEY] as byte[]);
Response.Flush();
Response.End();
}
这真的很管用。当我单击“导出到csv”按钮时,页面的updateprogress启动,我的加载覆盖出现(它是一个css div,在可见时覆盖窗口)。这可能需要一些时间,具体取决于数据集(可能需要几分钟),此时,我将收到一个窗口弹出窗口,其中包含我的文件。我可以在浏览器中保存或打开文件,当我保存文件时,可以使用导出按钮在页面上继续。酷。
我唯一的问题是updateprogress永远不会消失-回发没有完成(因为我正在将响应重定向到mini export页,并且没有对回发请求的专用响应?).
如果需要的话,我可以使用一个非常脆弱的解决方案,因为在Web应用程序的余生中,不太可能在其他任何地方需要这个功能。
我在Ajax非常环保,所以如果还没有一个优雅的解决方案可以使用,我不会感到惊讶。我真正想要避免的是强迫用户启动第二个请求来启动下载(就像你在文件下载站点上看到的那样:“你的下载不会在接下来的5秒钟内开始,所以只需点击这里”)。
有什么想法吗?