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

时间:2012-01-20 18:49:40

标签: jquery asp.net internet-explorer viewstate

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

当我第一次加载页面时,它会显示一个下拉列表。我选择一个特定的供应商,它会发回一个页面并返回所需的信息。如果我更改供应商,它仍将加载信息。当我使用$ .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\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

4 个答案:

答案 0 :(得分:11)

好的,这就是我想出的解决方案/黑客。我的问题是在页面上动态添加用户控件(通过ajax请求)正在改变页面的视图状态并抛出异常。经过研究,我发现viewstate存储了页面的状态(属性和设置)。一旦从Web服务返回控件html,就会有某种viewstate存储在页面上。当您回发到服务器时,它会在解密视图以重建页面时抛出异常。我只是使用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 :(得分:4)

我知道这已经得到了回答,但是还有其他一些选择:

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;
    }

答案 2 :(得分:1)

就我而言,问题是有两个<form></form>标签。

我的主页面上有一个TextBox。如果用户在此TextBox中输入值,则脚本将转到另一个页面并在用户继续编写该值时搜索该值。通常我创建了这个&#34;另一个&#34;点击WebsiteAdd New Item页面。所以Visual Studio为我创建了一个新页面。像往常一样,这个新页面也有<form></form>个标签。所以我删除了这个标签,问题就解决了。

以下是我的代码:

(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中,第二页不应包含<form></form>标记。

答案 3 :(得分:0)

清空“隐藏时”加载的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("&nbsp;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">
            &nbsp;Loading your benefits history...please wait a moment.
        </div>
    </div>
</div>