2012-01-20 1 views
7

Может кто-нибудь помочь мне с этим исключением. Я пробовал пару исправлений, но ничего не получилось. Я получаю это исключение только в IE (7, 8 и 9).Информация о состоянии недействительна для этой страницы и может быть повреждена. (Только в 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\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 
+1

Я бы преследовал это: «Ввод не является допустимой строкой Base-64, так как он содержит не-базовый символ 64, более двух прописных символов или небелый пробел среди символов заполнения». – DOK

+1

Я думаю, что знаю свою проблему. Добавление динамических элементов управления (ajaxly) на страницу изменяет состояние представления, и когда мы отправляем назад страницу, она выдает исключение, поскольку изменилось состояние просмотра. Я использовал хак для удаления всех мест (например, Div) с помощью jquery на страницеpost назад. Это означает удаление всего добавленного состояния просмотра. здесь мое решение $ ("# VendorListDropDownSearchable") изменение (функция() { $ ("# UserControl1DIV") удалить();. $ ("# UserControl2DIV") удалить();. }.); – Tauseef

+1

Отлично! Если вы подтвердите, что это решит вашу проблему, вернитесь сюда и создайте ответ. Это действительно поможет другим людям, которые обязательно найдут здесь свой путь. У меня тоже было такое же сообщение об ошибке, просто не помню. Неплохо отвечать на ваши вопросы (это так говорится в FAQ). – DOK

ответ

11

Хорошо, так вот решение/взлом я придумал. Моя проблема заключалась в том, что добавление пользовательского элемента управления динамически (через запрос ajax) на страницу меняло состояние просмотра страницы и выбрасывало исключение. После исследования выяснилось, что в представлении состояния хранится состояние страницы (свойства и настройки). После того, как вы вернете элементы управления html из веб-службы, на странице будет отображаться какое-то представление. И когда вы отправляете сообщение обратно на сервер, оно генерирует исключение, когда оно расшифровывает viewstae, чтобы перестроить страницу. Я просто удалил эти элементы управления (которые добавили динамически) на странице post back, используя 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 
    }); 
+0

Tauseef @Tauseef привет такая же проблема. только в т. – Mohammadreza

+0

Полностью была идентичная проблема. Спасибо за сообщение ответа! –

+0

У меня была такая же проблема только в IE9 (однако в IE10 была хорошая работа). Мне пришлось добавить OnClientClick к моей кнопке ASP.Net, чтобы вызвать функцию Javascript, такую ​​как ваша, перед попыткой запустить некоторый код C#, чтобы перенаправить на другую страницу ASP.Net. –

4

Я знаю, что это был дан ответ, но вот несколько других вариантов:

1). Если вы делаете вызов веб-службы с помощью Jquery .load(), вы можете просто удалить ViewState после возвращения используя параметр загружает обратного

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

2). Использование Html Agility Pack Вы можете сделать то же самое в веб-сервисе перед рендерингом возвращаемого элемента управления. Предположим, вы звоните в веб-службу, которая загружает 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; 
    } 
+1

+1 для вашего # 1 ответа: $ ('. AspNetHidden', this) .remove(); Я попробовал EnableViewState = «false», EnableViewStateMac = «false», ViewStateMode = «Отключено» на моей внутренней (загруженной jQuery) странице, ни одна из них не позволяла появляться из-под заголовков aspNetHidden, которые испортили представление в родительской странице. (Ошибка для всех браузеров для меня.) –

+0

Это была настоящая проблема. Спасибо! – CodeIt

1

В моем случае проблема была с двумя <form></form> тегами.

У меня есть TextBox на моей главной странице. Если пользователь вводит значение в этом текстовом поле, скрипт переходит на другую страницу и ищет это значение, пока пользователь продолжает его писать. Обычно я создал эту «другую» страницу, нажав Website, Add 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> бирка.