C# 下载文件并同时在ASP.NET中填充网格

C# 下载文件并同时在ASP.NET中填充网格,c#,asp.net,download,grid,C#,Asp.net,Download,Grid,我尝试使用ASP.NET按钮来做两件事 填充网格 下载/导出文件 我得到的代码发送的文件包含正确的数据,但是 A.未填充网格 B.出现异常Response.End() 你知道怎么修吗 protected void ButtonExportCSV_Click(object sender, EventArgs e) { try { ... Getting startDate, endDate List<WorkOrder> result = Get

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

  • 填充网格

  • 下载/导出文件

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

    A.未填充网格

    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)
        {
    
        }
    }
    
    但无论如何,网格并没有被填充


    有没有可能的线索?

    好的。我认为问题是

    您试图在一次响应中发送多个
    内容类型
    ,这是不可能的

  • 要填充网格,服务器需要发送
    html
    ,因此
    内容类型为text/html

  • 下载文件
    内容类型:text/csv

  • 在代码中,您正在使用
    text/csv
    覆盖
    text/html
    (调用
    GridView.DataBind()
    时默认设置)

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

    备选方案

    首先发送不带csv文件的GridView绑定响应


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

    您会遇到什么异常?显示来自
    getworkers的一些相关代码
    method@JAG请看一下更新后的问题。@VivekSharma它发生在'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.