今天需要做一个导出功能,但是导出的按钮一点击就是报错;
异常详细信息: System.Web.HttpException: 此页的状态信息无效,可能已损坏。
源错误:
[没有相关的源行]
源文件: c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\teacherwebsite\aba2332f\c906139a\App_Web_ppk8ycdo.10.cs 行: 0
堆栈跟踪:
[FormatException: Base-64 字符串中的无效字符。]
System.Convert.FromBase64String(String s) +0
System.Web.UI.ObjectStateFormatter.Deserialize(String inputString) +67
System.Web.UI.ObjectStateFormatter.System.Web.UI.IStateFormatter.Deserialize(String serializedState) +4
System.Web.UI.Util.DeserializeWithAssert(IStateFormatter formatter, String serializedState) +37
System.Web.UI.HiddenFieldPageStatePersister.Load() +136http://www.cnblogs.com/vagerent/archive/2009/09/21/1571271.html
这里解释的如下:
当页面A.aspx使用Ajax调用B.aspx中的数据时,在页面A中有服务器端控件,需要与服务器端交互,完成某些功能,这时候在单击服务器控件准备与服务器端进行交互时,就会出现错误信息:“此页的状态信息无效,可能已损坏”
而且进入不了后台代码。
产生的原因:
WebForm_InitCallback(); 的作用就是加载网页的状态post数据,而往__theFormPostData加载的方式是以在现有post字符后追加的方式添加的具体看源代码:
function WebForm_InitCallbackAddField(name, value)
{
var nameValue = new Object();
nameValue.name = name;
nameValue.value = value;
__theFormPostCollection[__theFormPostCollection.length] = nameValue;
__theFormPostData += name + "=" + WebForm_EncodeCallback(value) + "&";}
那么
WebForm_InitCallback(); 前必须加
__theFormPostData = "";
__theFormPostCollection = new Array();
是因为在网页在浏览器加载后发生了WebForm_InitCallback();调用,为__theFormPostData ,__theFormPostCollection填充了当前页初始状态的post数据,如果你在回调前不加这两句的话 __theFormPostData就会在原来的基础上再添加现有的网页状态post数据,这样可以说现在回调时你已包含了两份post数据,但回调时,服务器方仍然把它当作一份看待,结果服务器分析不出post数据,只给你返回了一个网页状态已损坏的消息
解决的方法就是去掉b页面里的form即可。
其实不是form的问题,是这样加载后,一个页面里有两个viewsate的隐藏域,.net解析的时候不知道该解析哪个
把不需要的viewstater的隐藏域去掉就行了
http://www.cnblogs.com/liuwenlong/archive/2011/05/09/2041047.html
这里方法比较详细