我有一个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_Clicked的代码隐藏中,我做了类似的事情:
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永远不会消失 - 回发没有完成(因为我将响应重定向到迷你导出页面并且没有对回发请求的专用响应?)。
如果需要,我可以使用非常脆弱的解决方案,因为在其应用程序的其他任何地方,其他任何地方都不太可能需要此功能。
我在AJAX非常环保如果没有一个我可以使用的优雅解决方案就不会感到惊讶。我真正想要避免的是强迫用户发起第二个请求来启动下载(就像你在文件下载网站上看到的那样=“你的下载不会在接下来的5秒内开始,所以只需点击这里”)。
有什么想法吗?
答案 0 :(得分:0)
我认为这不可行 - 文件下载和UpdateProgress的结果需要两个单独的响应。
我的解决方案需要2次点击,但没有页面转换。
我的导出按钮触发了生成导出数据的操作,我在用户的会话中对其进行了序列化。当这个动作完成后,我隐藏了导出按钮并做了一个'你下载它准备好了。点击此处保存'链接在我的页面上的位置可见。这一切都发生在导出按钮的事件处理程序的末尾。
当用户单击下载链接时,该事件处理程序将导出数据发送给用户。
我选择在此之后显示下载链接,直到用户刷新页面或更改页面上可能会更改可导出数据的其他控件。