代码之家  ›  专栏  ›  技术社区  ›  Stefan Mohr

执行服务器端操作的ASP.NET按钮,返回要下载的文件,并在单个请求中与updateProgress…配合使用。

  •  0
  • Stefan Mohr  · 技术社区  · 14 年前

    我有一个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秒钟内开始,所以只需点击这里”)。

    有什么想法吗?

    1 回复  |  直到 14 年前
        1
  •  0
  •   Stefan Mohr    14 年前

    我认为这是不可能的-文件下载和更新进度的结果需要两个单独的响应。

    我的解决方案需要单击2次,但没有页面转换。

    我的导出按钮触发了生成导出数据的操作,我在用户会话中对其进行了序列化。完成此操作后,我隐藏了导出按钮,并准备好了“您的下载”。单击此处保存“链接在我的页面上的位置可见”。这一切都发生在“导出”按钮的事件处理程序的末尾。

    当用户单击下载链接时,该链接的事件处理程序将导出数据发送给用户。

    之后,我选择保持下载链接可见,直到用户刷新页面或更改页面上的其他一些控件,这些控件将更改可导出的数据。