下载文件并同时在ASP.NET中填充Grid

时间:2016-08-17 14:03:40

标签: c# asp.net download grid

我尝试使用 ASP.NET按钮事件做两件事

  1. 填充网格

  2. 下载/导出文件

  3. 我得到的代码发送的文件包含正确的数据,但

    一个。网格未填充

    B中。有一个例外Response.End();

    有任何线索如何解决?

    protected void ButtonExportCSV_Click(object sender, EventArgs e)
    {
       try
       {
           ... Getting startDate, endDate
           List<WorkOrder> result = GetWorkOders(startDate, endDate); // It populates Grid  using  GridViewWorkOrders.DataSource = result;             GridViewWorkOrders.DataBind();
    
           string csv = DataHelper.ToCsv(";", result);  
    
           var filename = "WorkOrders-ingresados-" + DateTime.Now.ToString("ddMMyyyy-HHmmsss");
    
           Response.Clear();
    
           Response.ContentType = "text/csv";
           Response.AddHeader("Content-Disposition", "attachment;filename=" + filename + ".csv");
           Response.Write(csv);
           Response.End(); // The exception occurs here
        }
        catch (Exception ex)
        {
    
        }
    }
    

    enter image description here

    更新#1

    我可以摆脱用{/ 1>替换Response.End()的异常

    HttpContext.Current.Response.Flush(); // Sends all currently buffered output to the client.
    HttpContext.Current.Response.SuppressContent = true;  // Gets or sets a value indicating whether to send HTTP content to the client.
    HttpContext.Current.ApplicationInstance.CompleteRequest(); // Causes ASP.NET to bypass all events and filtering in the HTTP pipeline chain of execution and directly execute the EndRequest event.
    

    但无论如何都没有填充网格。

    是否可以提供任何线索?

1 个答案:

答案 0 :(得分:2)

确定。我认为问题是

您尝试在单个响应中发送多个Content-Type,这是不可能的

  1. 填充网格,服务器需要发送html所以Content-Type: text/html

  2. 下载文件Content-Type: text/csv

  3. 在您的代码中,您使用text/html覆盖GridView.DataBind()(在text/csv被调用时默认为<}}

    因此网格视图html将被删除,csv内容将附加到响应

    <强>替代

    首先发送没有csv文件的GridView绑定响应

    然后一旦页面加载了新的Grid,调用脚本函数调用服务器中的方法来下载csv文件