将gridview导出到excel文件时,Response.End()会生成错误

Som*_*ody 6 c# asp.net gridview export-to-excel

我有这个代码:

protected void ibtGenerateReport_Click(object sender, ImageClickEventArgs e)
{
    string filename = "report.xls";             

    StringWriter stringWriter = new StringWriter();
    HtmlTextWriter htmlWrite = new HtmlTextWriter(stringWriter);
    DataGrid DataGrd = new DataGrid();            
    DataGrd.DataSource = odsLSRAudit;
    DataGrd.DataBind();

    DataGrd.RenderControl(htmlWrite);            

    System.IO.StreamWriter vw = new System.IO.StreamWriter(filename, true);
    stringWriter.ToString().Normalize();
    vw.Write(stringWriter.ToString());
    vw.Flush();
    vw.Close();
    WriteAttachment(filename, "application/vnd.ms-excel", stringWriter.ToString());           
}

public static void WriteAttachment(string FileName, string FileType, string content)
{
    HttpResponse Response = System.Web.HttpContext.Current.Response;
    Response.ClearHeaders();
    Response.AppendHeader("Content-Disposition", "attachment; filename=" + FileName);
    Response.ContentType = FileType;
    Response.Write(content);            
    Response.End();
}
Run Code Online (Sandbox Code Playgroud)

但是Response.End()给了我以下错误:

Microsoft JScript runtime error: Sys.WebForms.PageRequestManagerParserErrorException: The message received from the server could not be parsed. Common causes for this error are when the response is modified by calls to Response.Write(), response filters, HttpModules, or server trace is enabled. Details: Error parsing near '<table cellspacing="'.

Response.Write(content)有,我可以看到正确的信息.但除上述错误外,不会出现"保存/打开"对话框.

我正在使用UpdatePanels.

fec*_*eco 27

将其添加到Page_Load()方法中

假设ibtGenerateReport是你的按钮

protected void Page_Load(object sender, EventArgs e) {
   ScriptManager scriptManager = ScriptManager.GetCurrent(this.Page);
   scriptManager.RegisterPostBackControl(this.ibtGenerateReport);
   //Further code goes here....
}
Run Code Online (Sandbox Code Playgroud)

说明:

UpdatePanel控件使用异步回发来控制页面的哪些部分呈现.它使用客户端上的一大堆JavaScript和服务器上的一大堆C#来实现这一点.这是使用客户端上的JavaScript可以理解的特殊格式呈现的.如果通过在页面的渲染阶段之外渲染事物来搞乱格式,则格式将被搞砸.

为什么我要继续获取PageRequestManagerParserErrorException?

好吧,你可能正在做错误信息中提到的事情之一.以下是最常见的原因以及它们不起作用的原因:

调用Response.Write(): 通过直接调用Response.Write(),您绕过了ASP.NET控件的正常呈现机制.您编写的位直接发送到客户端而无需进一步处理.

响应过滤器/ HttpModules: 与Response.Write()类似,它们可以以UpdatePanel不知道的方式更改呈现.

服务器跟踪已启用: 使用Response.Write()有效地写出跟踪,因此会混淆我们用于UpdatePanel的特殊格式.

调用Server.Transfer(): 不幸的是,没有办法检测到Server.Transfer()被调用了.这意味着当有人调用Server.Transfer()时,UpdatePanel无法执行任何智能操作.发送回客户端的响应是您转移到的页面的HTML标记.由于它的HTML而不是特殊格式,因此无法解析,并且您收到错误.

解决方案: 避免解析错误的一种方法是通过调用ScriptManager.RegisterPostBackControl()来执行常规回发而不是异步回发

具体请参阅Ellon立顿的博客完整的解释和其他解决方案 在这里