2009-06-10 4 views
0

В моей форме asp .net я обновляю элемент управления с помощью Ajax через библиотеку AjaxPro. Тем не менее, после того, как делать это ... в результате чего все «нормальные» результаты обратной передачи в желтом экране (Полная ошибка после сообщения)Информация о состоянии, поврежденная после динамического добавления управления

Я установил следующие свойства страницы в web.config без удачи

<pages enableSessionState="true" enableViewState="false" enableEventValidation="false" enableViewStateMac="false"> 

Я также пробовал генерировать машинный ключ в качестве некоторых решений, предлагаемых в Интернете. Но это тоже не помогает.

Любые предложения?

******************* Содержимое жёлтого экрана ASP .NET ******************** ****************

Server Error in '/' Application. 
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:\Windows\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\root\c89baa89\d92b83c5\App_Web_tahnujzf.4.cs Line: 0 

Stack Trace: 

[FormatException: Invalid character in a Base-64 string.] 
    System.Convert.FromBase64String(String s) +0 
    System.Web.UI.ObjectStateFormatter.Deserialize(String inputString) +72 
    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() +113 

[ViewStateException: Invalid viewstate. 
    Client IP: 127.0.0.1 
    Port: 49736 
    User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10 (.NET CLR 3.5.30729) 
    ViewState: /wEPDwULLTE0OTczNDQ1NjdkGAIFHl9fQ29udHJvbHNSZXF1aXJlUG9zdEJhY2tLZXlfXxYGBSljdGwwMCR1c3JTaG9wcGluZ0xpc3QkdXNyU2hvcHBpbmdMaXN0X3duZAUaY3RsMDAkdXNyU2hvcHBpbmdMaXN0JF9tZ3IFVGN0bDAwJFBsYWNlSG9sZGVyTWFpbiRjdGwwMCRfJHVzclZpZXdDYXJ0Q29udHJvbCRfJGN0bDAwJF8kcnB0TGluZUl0ZW1zJGN0bDAwJGNieEFsbAVcY3RsMDAkUGxhY2VIb2xkZXJNYWluJGN0bDAwJF8kdXNyVmlld0NhcnRDb250cm9sJF8kY3RsMDAkXyRycHRMaW5lSXRlbXMkY3RsMDEkaW1nQnRuQ2F0ZWdvcnkFWmN0bDAwJFBsYWNlSG9sZGVyTWFpbiRjdGwwMCRfJHVzclZpZXdDYXJ0Q29udHJvbCRfJGN0bDAwJF8kcnB0TGluZUl0ZW1zJGN0bDAxJGNieFNlbGVjdGlvbgVoY3RsMDAkUGxhY2VIb2xkZXJNYWluJGN0bDAwJF8kdXNyVmlld0NhcnRDb250cm9sJF8kdXNyUHJvZHVjdFF1aWNrVmlld1BvcHVwJHVzclByb2R1Y3RRdWlja1ZpZXdQb3B1cF93bmQFG2N0bDAwJFBsYWNlSG9sZGVyTWFpbiRjdGwwMA8XAgULQ3VycmVudFZpZXcFCFZpZXdDYXJ0BQ1BY3RpdmVWaWV3U2V0Z2Q=,/wEPDwUBMGQYAQUeX19Db250cm9sc1JlcXVpcmVQb3N0QmFja0tleV9fFgMFIWN0bDAxJF8kc...] 

[HttpException (0x80004005): The state information is invalid for this page and might be corrupted.] 

ответ

5

Я нашел проблему. В ответ на просьбу AJAX с библиотекой AjaxPro, оказываю управления, как SO-

Page page = new Page(); 

/*Not the exact way I init the control. But that's irrevelant*/ 
Control control = new Control(); 
page.Controls.Add(control) 
string controlHtml; 

using(StringWriter sw = new StringWriter()) 
{ 
    HttpContext.Current.Server.Execute(page, sw, false); 
    controlHtml = sw.ToString(); 
} 

Проблема этого подхода заключается в том, что жерех .net ВСЕГДА добавляет скрытое поле для ввода ViewState. Некоторые другие скрытые поля, такие как eventtarget, eventargument, eventvalidation, добавляются в зависимости от элементов управления, которыми располагает ваша страница/элементы управления. Затем, когда я добавляю полученный html к существующему элементу DOM на стороне клиента, вполне очевидно, что существуют дублированные скрытые поля ввода с тем же именем и идентификатором, что приводит к повреждению состояния представления.

Решение?

Стрим сгенерированный html этих тегов с помощью регулярного выражения (если вы в нем хороши) или функции сравнения строк/поиска и т. Д.

0

Похоже, что запрос обратной передачи может быть усечен. Вы можете проверить размер ViewState?

1

Регулярное выражение для замены ViewState: ReturnValue = Regex.Replace (HTML, @ "< [/] (форма | [ovwxp]:? \ W +) [^>] *>", "", RegexOptions .IgnoreCase);

+1

Привет, Hariharans87, добро пожаловать в StakOverflow. Этот вопрос задавали и отвечали почти 2 года назад. Считаете ли вы, что ваш ответ улучшается или каким-либо образом способствует принятию в настоящее время ответа? –

0

у вас есть два form метки на каждой странице, удалите один из них, и он решает:

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="test.ascx.cs" Inherits="shop_test" %> 
<asp:Panel runat="server" ID="basketpanel" Visible="True"> 
    <form id="Form1" runat="server"> 
    </form> 
    </asp:Panel> 
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="test.ascx.cs" Inherits="shop_test" %> 
<asp:Panel runat="server" ID="basketpanel" Visible="True"> 
    <form id="Form1" runat="server"> 
    </form> 
</asp:Panel> 
0

добавить эти строки в файл CS и он удалит VIEWSTATE поле из вывода HTML:

protected override void Render(HtmlTextWriter output) 
    { 
     StringWriter stringWriter = new StringWriter(); 

     HtmlTextWriter textWriter = new HtmlTextWriter(stringWriter); 
     base.Render(textWriter); 

     textWriter.Close(); 

     string strOutput = stringWriter.GetStringBuilder().ToString(); 

     strOutput = Regex.Replace(strOutput, "<input[^>]*id=\"__VIEWSTATE\"[^>]*>", "", RegexOptions.Singleline); 

     output.Write(strOutput); 
    } 
Смежные вопросы