错误消息:
Sys.WebForms.PageRequestManagerParserErrorException: 无法分析从服务器收到的消息。之所以出现此错误,常见的原因是: 在通过调用 Response.Write() 修改响应时,将启用响应筛选器、HttpModule 或服务器跟踪。
发生状况:
页面使用了ajax的UpdatePanels,在使用excel导出时,使用了Response.WriteFile这样的方法,所以出现上述错误。
解决办法:
1、将使用了Response.Write的控件放到啊UpdatePanels外面,或者将UpdatePanels删除。当然大多数情况下,我们是不可以删除UpdatePanels的。
2、如果控件的名称是唯一的,可以使用在UpdatePanels里增加PostBackTrigger ,并制定controlid为你的控件:
<Triggers><asp:PostBackTrigger ControlID="btnExport" /></Triggers>
3、如果你的控件是动态的,比如在gridview每行中都有的按钮,可以使用ScriptManager.RegisterPostBackControl()来注册你的控件
protected void gvGirdView_RowDataBound(object sender, GridViewRowEventArgs e)
{
//不为表头
if (e.Row.RowType == DataControlRowType.DataRow)
{
//含有ajax的updatepanel的页面必须将想要使用Response.Write的控件注册PostBackControl
//本业务使用了excel导出,所以必须绑定
//我的业务用到了模板页,ScriptManager 定义在模板页上,所以使用this.Parent.Parent到上级去找ScriptManager
//实际可根据自己程序情况查找
ScriptManager smManage = (ScriptManager)this.Parent.Parent.FindControl("smManage ");
if (e.Row.FindControl("btExport") != null)
{
smManage .RegisterPostBackControl(e.Row.FindControl("btExport"));
}
}
}
上面为转载
以下为自己使用经历:
由于这样是动态注册了回传控件,在回传后,应该需要再重新绑定一次gridview控件,否则之前动态注册的代码将会因为这次回传而失效,切记
(4)如果控件是动态的,需要点击后在后台弹出对话框,则,可以使用以下方式
ScriptManager.RegisterStartupScript(this, GetType(), "执行结果", "<script>alert('提交成功');</script>", false);