Проблема с LoadViewState после обновления страницы F5 - Не удалось загрузить viewstate

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