60

我的页面上有一个网格视图,我想将其导出到 Excel 工作表,下面是我为执行此任务而编写的代码,这里我已经将数据集传递给绑定网格的方法,并且btnExcelExport是按钮将网格内容导出到 Excel 表:-

private void BindGridView(DataSet ds)
{
    if (ds.Tables.Count > 0)
    {
        if (ds.Tables[0].Rows.Count > 0)
        {
            GVUserReport.DataSource = ds;
            GVUserReport.DataBind();
            btnExcelExport.Visible = true;
        }
    }
}

protected void btnExcelExport_Click(object sender, EventArgs e)
{
    Response.Clear();
    Response.AddHeader("content-disposition","attachment;filename=FileName.xls");
    Response.Charset = "";
    Response.Cache.SetCacheability(HttpCacheability.NoCache);
    Response.ContentType = "application/vnd.xls";
    System.IO.StringWriter stringWrite = new System.IO.StringWriter();
    System.Web.UI.HtmlTextWriter htmlWrite = new HtmlTextWriter(stringWrite);
    GVUserReport.RenderControl(htmlWrite);
    Response.Write(stringWrite.ToString());
    Response.End();
}

public override void VerifyRenderingInServerForm(Control control)
{
    return;
}

现在,当我调试时,我发现网格已成功绑定,但是在尝试将其导出到 Excel 时,出现此错误:

“Microsoft JScript 运行时错误:Sys.WebForms.PageRequestManagerParserErrorException:无法解析从服务器接收到的消息。”

4

9 回答 9

141

我解决了这个问题。当我使用UpdatePanel时,我在页面事件中添加了以下代码,Page_Load它对我有用:

protected void Page_Load(object sender, EventArgs e) {
  ScriptManager scriptManager = ScriptManager.GetCurrent(this.Page);
  scriptManager.RegisterPostBackControl(this.btnExcelExport);
  //Further code goes here....
}
于 2012-06-27T07:43:05.397 回答
18

就我而言,问题是由网站母版页上的一些Response.Write命令引起的(代码隐藏)。他们在那里只是为了调试目的(我知道这不是最好的方法)......

于 2014-02-25T11:54:36.577 回答
9

我将控件添加到Triggers更新面板中的标签中:

    </ContentTemplate>
    <Triggers>
        <asp:PostBackTrigger ControlID="exportLinkButton" />
    </Triggers>
</asp:UpdatePanel>

这样,exportLinkBut​​ton 将触发 UpdatePanel 进行更新。
更多信息在这里

于 2016-07-29T21:53:16.107 回答
6

1-永远不要使用 Response.Write。

2-我在创建(不在Page_Load中)一个LinkBut​​ton(动态)后将代码放在下面并解决了我的问题:

ScriptManager scriptManager = ScriptManager.GetCurrent(this.Page);
scriptManager.RegisterPostBackControl(lblbtndoc1);
于 2015-05-06T20:53:58.583 回答
5

对于我的 VB.Net 朋友 -

Dim scriptManager As ScriptManager = scriptManager.GetCurrent(Me.Page)
scriptManager.RegisterPostBackControl(Me.YourButtonNameHere)
于 2017-11-30T20:28:59.463 回答
4

我有同样的错误,然后我尝试<asp:PostBackTrigger ControlID="xyz"/>而不是AsyncPostBackTrigger。这对我有用。这是因为我们不想要部分回发。

于 2014-05-19T05:59:56.280 回答
3

将此添加到您的 PageLoad 中,它将解决您的问题:

ScriptManager scriptManager = ScriptManager.GetCurrent(this.Page);
scriptManager.RegisterPostBackControl(this.lblbtndoc1);
于 2013-02-06T12:27:38.817 回答
1

对我也有用,但有一个补充(下)。

protected void Page_Load(object sender, EventArgs e) {
  ScriptManager scriptManager = ScriptManager.GetCurrent(this.Page);
  scriptManager.RegisterPostBackControl(this.btnExcelExport);
  //Further code goes here....
}

我在按钮上注册了一个脚本,以便在其事件处理完成后单击另一个按钮。为了让它工作,我不得不从更新面板中删除另一个按钮(以防万一有人遇到同样的问题)。

于 2016-07-20T14:03:06.077 回答
0

对我有用的是在 inetpub VirtualDirectories\443\web.config 文件的 appSettings 标记上将 aspnet:MaxHttpCollectionKeys 设置为高值:

<configuration>
    <appSettings>
        <add key="aspnet:MaxHttpCollectionKeys" value="100000" />
    </appSettings>
</configuration>
于 2019-04-17T15:00:37.057 回答