Проблема с LoadViewState после обновления страницы F5 - Не удалось загрузить представление состояния - PullRequest
2 голосов
/ 01 декабря 2009

У меня проблема в приложении ASP.NET с обновлением страницы Viewstate и F5.

Если после перехода с одной страницы на другую я сразу нажимаю F5, я получаю следующую ошибку:

System.InvalidCastException 
"Unable to cast object of type 'System.Web.UI.Triplet' 
to type 'System.Web.UI.Pair'."

Это приводит к следующему исключению, отображаемому на странице:

HttpException (0x80004005): Failed to load viewstate.  The control tree 
into which viewstate is being loaded must match the control tree that 
was used to save viewstate during the previous request.  
For example, when adding controls dynamically, the controls added during a 
post-back must match the type and position of the controls added during 
the initial request.]
System.Web.UI.Control.LoadViewStateRecursive(Object savedState) +310
System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) +136
System.Web.UI.Control.LoadViewStateRecursive(Object savedState) +224
System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) +136
System.Web.UI.Control.LoadViewStateRecursive(Object savedState) +224
System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) +136
System.Web.UI.Control.LoadViewStateRecursive(Object savedState) +224
System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) +136
System.Web.UI.Control.LoadViewStateRecursive(Object savedState) +224
System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState) +136
System.Web.UI.Control.LoadViewStateRecursive(Object savedState) +224
System.Web.UI.Page.LoadAllState() +439
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1092

Точка, в которой происходит сбой, находится в переопределенном методе LoadViewState для пользовательского элемента управления меткой, когда он вызывает родительский LoadViewState

System.Web.UI.WebControls.Label.LoadViewState(ByVal savedState As Object)

Похоже, что для объекта saveState используется совершенно другой элемент управления (раскрывающийся список), представляющий собой System.Web.UI.Triplet, а не объект System.UI.Pair, ожидаемый элементом управления Label.

Если я делаю то же самое, используя другую страницу в том же приложении, страница загружается нормально после обратной передачи F5. Две веб-страницы наследуются от одного базового класса и используют одинаковые пользовательские элементы управления. Страница, вызывающая проблемы, не имеет динамически добавленных элементов управления.

После отладки процесса создается впечатление, что событие LoadViewState не запускается после обратной передачи F5 для элементов управления на странице, которые успешно загружаются. SaveViewState запускается в обоих случаях.

Есть идеи, почему событие LoadViewState будет запущено для одной страницы, а не для другой? Я довольно новичок в ASP.NET и до сих пор разбираюсь, как работает ViewState.

1 Ответ

1 голос
/ 01 декабря 2009

Трудно сказать много, не видя ваш код. Тем не менее, несколько вещей, которые могут помочь:

  1. Возможно, вы захотите посмотреть обмен HTTP во время сбоя, используя веб-отладчик, такой как Fiddler; есть большая вероятность, что ответ выскочит на вас.
  2. Помните, что F5 повторно выдает последний запрос. Если вы переходите с одной страницы на другую, ViewState вообще не должно быть, если только вы не делаете постраничную публикацию.
  3. Если ViewState не отправляется с запросом, возможно, природа ошибки связана с тем, как вы ее кодируете?
  4. LoadViewState () следует вызывать, только когда входящий запрос содержит ViewState, который необходимо загрузить в связанный элемент управления.
  5. SaveViewState () вызывается для каждого запроса страницы, чтобы сохранить состояние элемента управления в скрытом поле на странице, чтобы он был доступен при обратной передаче.
...