jQuery 此页面的状态信息无效,可能已损坏。(仅在 IE 中)
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/8946374/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
The state information is invalid for this page and might be corrupted. (Only in IE)
提问by Tauseef
Can anybody help me out with this exception. I have tried couple of fixes but nothing worked. I am getting this exception only in IE(7, 8 and 9).
任何人都可以帮我解决这个例外。我尝试了几个修复,但没有任何效果。我仅在 IE(7、8 和 9)中遇到此异常。
When i load the page first time, it brings up a dropdown. where i select a specific vendor and it makes a page post back and returns the required information. If i change the vendor it will still load the information. When i load a control onto page using $.ajax request dynamically and than go back and change the dropdown selection(select a different vendor), it craps out and gave me the following exception. Again it only happens in the IE.
当我第一次加载页面时,它会弹出一个下拉菜单。我选择了一个特定的供应商,它会回发一个页面并返回所需的信息。如果我更改供应商,它仍然会加载信息。当我使用 $.ajax 请求动态地将控件加载到页面上,然后返回并更改下拉选择(选择不同的供应商)时,它会失败并给我以下异常。同样,它只发生在 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\root91c7081e6443\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+iBYuk3mWm8jr6sWvstheitroadtwH8b3E/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\root91c7081e6443\App_Web_a3kdfsht.2.cs:0
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +100
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +75
回答by Tauseef
Ok, so here is the solution/hack i came up with. My problem was that adding a user control dynamically (through ajax request) onto page was changing the view state of the page and was throwing an exception. Upon research I found out that viewstate stores the state of a page (properties and settings). Once you return the controls html from a web service, there is going to be some sort of viewstate stored onto page. And when you post back to the server, it will throw an exception when it decrypt the viewstae to rebuild the page. I have simply removed those controls (which got added dynamically) on page post back using jquery and problem got solved.
好的,这是我想出的解决方案/黑客。我的问题是在页面上动态添加用户控件(通过 ajax 请求)正在更改页面的视图状态并引发异常。经过研究,我发现 viewstate 存储页面的状态(属性和设置)。一旦您从 Web 服务返回控件 html,就会有某种视图状态存储到页面上。当您回发到服务器时,它会在解密视图以重建页面时抛出异常。我只是使用 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
});
回答by Ben Ziegler
I know this has been answered but here are a couple of other options:
我知道这已经得到回答,但这里有几个其他选择:
1). If you're doing a web service call via jquery .load() you can just remove the viewstate upon return using loads callback parameter
1)。如果您通过 jquery .load() 进行网络服务调用,您可以在返回时使用负载回调参数删除视图状态
$('#myDiv').load('/MyPage.aspx', null, function(){
$('.aspNetHidden', this).remove(); // removes viewstate from returned aspx html
});
2). Using the Html Agility PackYou can do this same thing in a web service before rendering the returned control. Assume you're calling a web service which loads a UserControl.ascx in the service and then renders it's html before returning.
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;
}
回答by nes
In my case, the problem was having two <form></form>
tags.
就我而言,问题是有两个<form></form>
标签。
I have a TextBox in my main page. If the user enters a value in this TextBox, a Script goes to another page and searches that value while user continues to write it. Normally I created this "another" page by clicking Website
, Add New Item
. So Visual Studio created a new page for me. As usual there was <form></form>
tag in this new page, too. So I deleted this tags and the problem was solved.
我的主页中有一个 TextBox。如果用户在此 TextBox 中输入一个值,脚本将转到另一个页面并搜索该值,同时用户继续编写它。通常我通过单击Website
,创建了这个“另一个”页面Add New Item
。所以 Visual Studio 为我创建了一个新页面。像往常一样<form></form>
,这个新页面也有标签。所以我删除了这个标签,问题就解决了。
Below are my codes:
以下是我的代码:
(PS: I use MasterPage. But the below code is only needed in my main page)
(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);")
In the above code serinover.aspx
is the second page which should not have <form></form>
tag.
在上面的代码中serinover.aspx
是不应该有<form></form>
标签的第二页。
回答by Joe
Empty the div you loaded "on hiddden". I found that emptying the div or setting it back to the original text (mine was a loading message) both worked.
清空您“隐藏”加载的 div。我发现清空 div 或将其设置回原始文本(我的是加载消息)都有效。
<a class="popmodal" href="YOUR HREF HERE">View History</a>
$('.popmodal').on('click', function (e) {
e.preventDefault();
$('#modalViewBenefitsHistory').modal('show').find('.modal-content').load($(this).attr('href'));
});
$('#modalViewBenefitsHistory').on('hidden.bs.modal', function (e) {
$('.modal-content').empty();
})
--OR
$('#modalViewBenefitsHistory').on('hidden.bs.modal', function (e) {
$('.modal-content').text(" Loading your benefits history...please wait a moment.");
})
<div id="modalViewBenefitsHistory" aria-hidden="true" class="modal fade">
<div class="modal-dialog modal-dialog-centered">
<div class="modal-content">
Loading your benefits history...please wait a moment.
</div>
</div>
</div>