状态信息对于此页面无效,可能已损坏。 (仅限IE)

任何人都可以帮我解决这个例外。 我尝试了几个修复,但没有任何效果。 我只在IE(7,8和9)中获得此exception。

当我第一次加载页面时,它会显示一个下拉列表。 我选择一个特定的供应商,它会发回一个页面并返回所需的信息。 如果我更改供应商,它仍将加载信息。 当我使用$ .ajax请求动态地将控件加载到页面上,然后返回并更改下拉列表选择(选择其他供应商)时,它会疯弃并给出以下exception。 它再次发生在IE中。

The state information is invalid for this page and might be corrupted. Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. Exception Details: System.Web.HttpException: The state information is invalid for this page and might be corrupted. Source Error: [No relevant source lines] Source File: c:\Users\tmalik\AppData\Local\Temp\Temporary ASP.NET Files\root\6691c708\751e6443\App_Web_a3kdfsht.2.cs Line: 0 Stack Trace: [FormatException: The input is not a valid Base-64 string as it contains a non-base 64 character, more than two padding characters, or a non-white space character among the padding characters. ] System.Convert.FromBase64String(String s) +0 System.Web.UI.ObjectStateFormatter.Deserialize(String inputString) +77 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() +147 [ViewStateException: Invalid viewstate. Client IP: 127.0.0.1 Port: Referer: http://localhost:57289/vendor.aspx Path: /vendor.aspx User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; MDDR) ViewState: 2D1IMRanPXfVARbRp1ooiwD71WHybNzxSNLbbA0G3MxKeo7m52dHWLBPGdnMH5JthTnPVt7UES/PVx39dfZYHbr0/DL7J58mvA2I4wRUSdDShVxvZqC7ZPZWcatowpZ7VYaD9PFKW7OkgppCwmePFuYnpU8kWDT5TvSLqN50Flrqpv0zCM9YoCKemfesa68rqBkkSTijcxnxdDCgvzSl72giI4ZhwK92wD22Ma6scW4PFjRZeTsKoowJq+JqJGuBMEepwKguFUy4dX86UIULnJ7NQsgZW1aQvpZdnfSRCSYrWhFWPhKTPsS622eaQYShsxddPs/mfEB26f54WS+iBYuk3mWm8jr6sWvsOIRtwH8b3E/5UujbgAxTNVg8BhzpSFvmE4KwGKo0tKuuqOFtP0pjpaAI7fV3EQ1M7BVQSAVrtBevRFJ0PlCPrU2aQms2LVeE5POqTJGtY+74xWkdCtLzT04Ug4R+SMBRElQBqX/5A54OHj2ghYjJ/3tgg4ToGUX2xrQ/c70lrphP+kabGVM2Op4DFjZAaOZj/CDVUurH2BYXKuJdUvzbf2zHngoOnqZGqrw3n6V6HGcnHNKxfuGQ20MPdxJYCbYHGiRqixzV1NxJoHFHbYCVx3IlrqF0W44AFKm2gzzk3V8zu9lUjyFNvUNBMjNaZeekLtcWpszhKrm8WhVnWQAk1CXxKJqyK0RC3...] [HttpException (0x80004005): The state information is invalid for this page and might be corrupted.] System.Web.UI.ViewStateException.ThrowError(Exception inner, String persistedState, String errorPageMessage, Boolean macValidationError) +235 System.Web.UI.ViewStateException.ThrowViewStateError(Exception inner, String persistedState) +14 System.Web.UI.HiddenFieldPageStatePersister.Load() +251 System.Web.UI.Page.LoadPageStateFromPersistenceMedium() +106 System.Web.UI.Page.LoadAllState() +43 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +8431 System.Web.UI.Page.ProcessRequest(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +253 System.Web.UI.Page.ProcessRequest() +78 System.Web.UI.Page.ProcessRequestWithNoAssert(HttpContext context) +21 System.Web.UI.Page.ProcessRequest(HttpContext context) +49 ASP.vendor_aspx.ProcessRequest(HttpContext context) in c:\Users\tmalik\AppData\Local\Temp\Temporary ASP.NET Files\root\6691c708\751e6443\App_Web_a3kdfsht.2.cs:0 System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +100 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +75 

好的,所以这里是我提出的解决方案/黑客。 我的问题是在页面上动态添加用户控件(通过ajax请求)正在改变页面的视图状态并抛出exception。 经过研究,我发现viewstate存储了页面的状态(属性和设置)。 一旦从Web服务返回控件html,就会有某种视图状态存储在页面上。 当您回发到服务器时,它会在解密视图以重建页面时抛出exception。 我只是使用jquery删除了那些在页面上发布的控件(动态添加)并且问题得到了解决。

 //In my case "VendorListDropDownSearchable", causes the page post back. $("#VendorListDropDownSearchable").change( function () { $("#UserControl1DIV").remove(); //removing the place holder holding control1 $("#UserControl2DIV").remove(); //same as above }); 

我知道这已经得到了回答,但这里有几个其他的选择:

1)。 如果您正在通过jquery .load()进行Web服务调用,则只需在使用load callback参数返回时删除viewstate

 $('#myDiv').load('/MyPage.aspx', null, function(){ $('.aspNetHidden', this).remove(); // removes viewstate from returned aspx html }); 

2)。 使用Html Agility Pack在渲染返回的控件之前,您可以在Web服务中执行相同的操作。 假设您正在调用一个Web服务,该服务在服务中加载UserControl.ascx,然后在返回之前呈现它的html。

 [WebMethod(EnableSession = true)] [System.Web.Script.Services.ScriptMethod] public string GetControlHtml() { // do stuff to get the control you want .... Page page = new Page(); HtmlForm form = new HtmlForm(); var ctl = (MyControlsNameSpace.Controls.MyControl)page.LoadControl("Controls\\MyControl.ascx"); page.Controls.Add(form); form.Controls.Add(ctl); StringWriter result = new StringWriter(); HttpContext.Current.Server.Execute(page, result, false); // Extension Method RemoveViewStateFromControl var MyControlsHTML = result.RemoveViewStateFromControl(); return MyControlsHTML; } ..... // In an extensions class.... public static string RemoveViewStateFromExecuteControl(this StringWriter writer) { HtmlAgilityPack.HtmlDocument Doc = new HtmlDocument(); Doc.LoadHtml(writer.ToString()); var Divs = Doc.DocumentNode.SelectNodes("//div"); if (Divs != null) { foreach (var Tag in Divs) { if (Tag.Attributes["class"] != null) { if (string.Compare(Tag.Attributes["class"].Value, "aspNetHidden", StringComparison.InvariantCultureIgnoreCase) == 0) { Tag.Remove(); } } } } return Doc.DocumentNode.OuterHtml; } 

就我而言,问题是有两个

标签。

我的主页面上有一个TextBox。 如果用户在此TextBox中输入值,则脚本将转到另一个页面并在用户继续编写该值时搜索该值。 通常我通过单击“ Website ,“ Add New Item ”来创建此“另一个”页面。 所以Visual Studio为我创建了一个新页面。 像往常一样,这个新页面也有

标签。 所以我删除了这个标签,问题解决了。

以下是我的代码:

(PS:我使用MasterPage。但下面的代码仅在我的主页中需要)

  Dim scriptText As String scriptText = "" scriptText += "function serinogoster(str) {" + Chr(10) scriptText += "var xhttp;" + Chr(10) scriptText += "if (str == '') {" + Chr(10) scriptText += "document.getElementById('ctl00_ContentPlaceHolder1_Label19').innerHTML = '';" + Chr(10) scriptText += "return;" + Chr(10) scriptText += "}" + Chr(10) scriptText += "xhttp = new XMLHttpRequest();" + Chr(10) scriptText += "xhttp.onreadystatechange = function() {" + Chr(10) scriptText += "if (this.readyState == 4 && this.status == 200) {" + Chr(10) scriptText += "document.getElementById('ctl00_ContentPlaceHolder1_Label19').innerHTML = this.responseText;" + Chr(10) scriptText += "}" + Chr(10) scriptText += "};" + Chr(10) scriptText += "xhttp.open('GET', 'serinover.aspx?serino='+str, true);" + Chr(10) scriptText += "xhttp.send();" + Chr(10) scriptText += "}" + Chr(10) Me.ClientScript.RegisterClientScriptBlock(Me.GetType(), "OnKeyUpScript", scriptText, True) TextBox6.Attributes.Add("onkeyup", "serinogoster(this.value);") 

在上面的代码中, serinover.aspx是第二页,不应该有

标签。