2009-12-01 2 views
2

У меня возникла проблема в моем приложении ASP.NET с обновлением страницы Viewstate и F5.Проблема с LoadViewState после обновления страницы F5 - Не удалось загрузить viewstate

Если после переходе с одной страницы на другую, я сразу же нажать 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) 

Объект savedState представляется для совершенно другого элемента управления (выпадающего списка), который является 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() вызывается для каждого запроса страницы, чтобы сохранить состояние элемента управления в скрытом поле на странице, чтобы оно было доступно во время обратной передачи.
Смежные вопросы