c# - Response.End() 在将 gridview 导出到 excel 文件时产生错误

标签 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();
}

但是 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)如我所见,有正确的信息。但是除了上述错误之外,没有出现保存/打开对话框。

我正在使用 UpdatePanel。

最佳答案

将此添加到您的 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....
}

解释:

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 Lipton 博客的完整解释和其他解决方案 here

关于c# - Response.End() 在将 gridview 导出到 excel 文件时产生错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14942085/

相关文章:

c# - 将字符串和字符放在一起的性能

c# - 为 INSERT INTO 查询中的 UNIQUEIDENTIFIER 生成文字

c# - 哪个最好使用 ViewState 或 hiddenfield

javascript - 3级嵌套中继器

c# - 主机与 DnsSafeHost

c# - 在 XNA 中制作游戏窗口 "always on top"

c# - 文本更改事件后如何保持对文本框的关注

android - 如何有效地在 gridview 中加载互联网图像?

c# - 如何保持 Jquery gridview 悬停菜单可见

asp.net - VB.net gridview 显示的数据比我想要的多