我尝试使用 ASP.NET按钮事件做两件事
填充网格
下载/导出文件
我得到的代码发送的文件包含正确的数据,但
一个。网格未填充
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)
{
}
}
更新#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.
但无论如何都没有填充网格。
是否可以提供任何线索?
答案 0 :(得分:2)
确定。我认为问题是
您尝试在单个响应中发送多个Content-Type
,这是不可能的
填充网格,服务器需要发送html
所以Content-Type: text/html
下载文件Content-Type: text/csv
在您的代码中,您使用text/html
覆盖GridView.DataBind()
(在text/csv
被调用时默认为<}}
因此网格视图html将被删除,csv内容将附加到响应
<强>替代强>
首先发送没有csv文件的GridView绑定响应
然后一旦页面加载了新的Grid,调用脚本函数调用服务器中的方法来下载csv文件