У меня проблема в приложении 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.