【问题标题】:Response.End() generates an error when exporting gridview to excel file将gridview导出到excel文件时Response.End()产生错误
【发布时间】:2013-02-18 17:35:22
【问题描述】:

我有这个代码:

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

我正在使用更新面板。

【问题讨论】:

标签: c# asp.net gridview export-to-excel


【解决方案1】:

将此添加到您的 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 不知道的方式更改渲染。

服务器跟踪已启用: Trace 是使用 Response.Write() 有效写出的,因此弄乱了我们用于 UpdatePanel 的特殊格式。

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

解决方案: 避免解析错误的一种方法是通过调用 ScriptManager.RegisterPostBackControl()

进行常规回发而不是异步回发

请参阅 Ellon Lipton 博客中的完整说明和其他解决方案 here

【讨论】:

【解决方案2】:

更改 Response.End :

Response.Flush();
HttpContext.Current.ApplicationInstance.CompleteRequest();

Response.End 是一种不好的做法,它会中止线程以绕过 http 请求生命周期中的其余操作并引发异常。

【讨论】:

    【解决方案3】:

    您是否在向响应写入任何内容之前尝试了 Response.Clear(),然后在结束响应之前尝试了 Response.Flush()?

    此外,在 Response.End() 中传递 true 值也无妨,以避免重定向时出现 HTTP 异常错误。只要确保其余的代码隐藏没有做你不想要的额外处理。

    【讨论】:

    • 我没有注意到他正在使用更新面板 - 在这种情况下不需要 Clear()。
    【解决方案4】:

    由于您尝试通过 UpdatePanels 执行此操作,您应该尝试使用 jQuery Ajax 并在页面加载事件的单独页面中编写此代码,以便在您调用此页面的请求时获取文件。新的响应实际上是删除了需要解析为对先前更新面板请求的响应的信息。

    【讨论】:

      【解决方案5】:

      此代码与您的 aspx 中的某些 UpdatePanel/AJAX 冲突。

      尝试在你的 aspx 中写这个:

      Code - 应该可以! :')

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多