Не удалось загрузить viewstate. Случается только изредка. Трудно воссоздать

Подробности ошибки приведены ниже. Эта ошибка возникает только изредка/редко/иногда, и нет никаких способов ее воспроизведения.

Как узнать, какой элемент управления выбрасывает эту ошибку ViewState?

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

Когда: Редко/Иногда

Шаги для воссоздания: Может не

Трассировка стека:

System.Web.HttpUnhandledException: Exception of type 'System.Web.HttpUnhandledException' was thrown. ---> System.Web.HttpException: 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.
   at System.Web.UI.Control.LoadViewStateRecursive(Object savedState)
   at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState)
   at System.Web.UI.Control.LoadViewStateRecursive(Object savedState)
   at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState)
   at System.Web.UI.Control.LoadViewStateRecursive(Object savedState)
   at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState)
   at System.Web.UI.Control.LoadViewStateRecursive(Object savedState)
   at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState)
   at System.Web.UI.Control.LoadViewStateRecursive(Object savedState)
   at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState)
   at System.Web.UI.Control.LoadViewStateRecursive(Object savedState)
   at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState)
   at System.Web.UI.Control.LoadViewStateRecursive(Object savedState)
   at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState)
   at System.Web.UI.Control.LoadViewStateRecursive(Object savedState)
   at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState)
   at System.Web.UI.Control.LoadViewStateRecursive(Object savedState)
   at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState)
   at System.Web.UI.Control.LoadViewStateRecursive(Object savedState)
   at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState)
   at System.Web.UI.Control.LoadViewStateRecursive(Object savedState)
   at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState)
   at System.Web.UI.Control.LoadViewStateRecursive(Object savedState)
   at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState)
   at System.Web.UI.Control.LoadViewStateRecursive(Object savedState)
   at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState)
   at System.Web.UI.Control.LoadViewStateRecursive(Object savedState)
   at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState)
   at System.Web.UI.Control.LoadViewStateRecursive(Object savedState)
   at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState)
   at System.Web.UI.Control.LoadViewStateRecursive(Object savedState)
   at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState)
   at System.Web.UI.Control.LoadViewStateRecursive(Object savedState)
   at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState)
   at System.Web.UI.Control.LoadViewStateRecursive(Object savedState)
   at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState)
   at System.Web.UI.Control.LoadViewStateRecursive(Object savedState)
   at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState)
   at System.Web.UI.Control.LoadViewStateRecursive(Object savedState)
   at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState)
   at System.Web.UI.Control.LoadViewStateRecursive(Object savedState)
   at System.Web.UI.Control.LoadChildViewStateByIndex(ArrayList childState)
   at System.Web.UI.Control.LoadViewStateRecursive(Object savedState)
   at System.Web.UI.Page.LoadAllState()
   at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
   --- End of inner exception stack trace ---
   at System.Web.UI.Page.HandleError(Exception e)
   at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
   at System.Web.UI.Page.ProcessRequest(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
   at System.Web.UI.Page.ProcessRequest()
   at System.Web.UI.Page.ProcessRequestWithNoAssert(HttpContext context)
   at System.Web.UI.Page.ProcessRequest(HttpContext context)
   at ASP.sessions_aspx.ProcessRequest(HttpContext context) in c:\windows\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\root\73694782\85423fe4\App_Web_mnrmfsfa.8.cs:line 0
   at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
   at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

Ответы

Ответ 1

К сожалению, нет способа узнать, какой именно виновный элемент управления не добавлен правильно в иерархию управления.

Есть!

Отключите "Только мой код" в настройках отладки. И поймайте все заброшенные исключения (отметьте "брошен" для Common Language Runtime в диалоговом окне, открываемом Ctrl-Alt-E).

После возникновения исключения перейдите в ближайший стек стека, где доступен объект Control, и проверьте его ClientID и родителей.

Ответ 2

В более общем случае эта ошибка возникает, когда иерархия управления страницы изменяется таким образом, чтобы среда не загружала состояние представления. Механизм состояния представления предполагает, что иерархия управления одинакова при загрузке, как это было, когда она была сохранена.

Этот может выглядеть как случайная ошибка, потому что бывают случаи, когда смена элементов управления на странице не препятствует загрузке состояния представления. Посмотрите на свою страницу и посмотрите элементы управления, которые динамически создаются/удаляются. Убедитесь, что все элементы управления добавлены на страницу до, состояние загрузки загружается (это было бы до загрузки страницы).

К сожалению, нет способа узнать, какой именно виновный элемент управления не добавлен правильно в иерархию управления. Общим способом увидеть эту ошибку является добавление некоторых динамических элементов управления в событие (например, при выпадающем выбранном индексе изменено) - таким образом их состояние сохраняется для просмотра состояния - но не добавляет их снова при обратной передаче - таким образом вид состояние недействительно, поскольку элементы управления больше не существуют при загрузке состояния представления.

Ответ 3

Существует обходной путь для этой ошибки:

Устанавливает свойство EnableViewstate всех элементов управления динамической загрузкой на false. Это не полное решение; мы отключили элемент управления ViewState здесь, чтобы обойти эту ошибку.

Это решение может привести к тому, что другие ошибки поднимут голову, поэтому будьте осторожны при применении этого исправления.

Ответ 4

Я испытал эту ошибку, это происходит, когда есть обратная передача с перекрестными страницами.

Например: вы загружаете View A. View A load fine, по какой-либо причине условия, при которых View A загружен, больше не существуют. Страница резервного копирования - это вид B. Таким образом, пользователь заполняет форму на View A и postback. Поскольку условия View A больше не выполняются, View Значения формы отправляются в View B.

Ответ 5

У меня была эта ошибка, когда мои пользовательские элементы управления были случайно созданы в Page_Load(). Элементы управления должны динамически создаваться в OnInit().

Ответ 7

Я видел эту ошибку при использовании gridview. Это произойдет, когда взаимодействие с пользователем вызовет обратную передачу до того, как страница будет полностью выполнена.

Я считаю, что он был исправлен в VS2005 SP1.

Ответ 8

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

Ответ 9

Я испытал ту же самую проблему. У меня было 2 списка на главной странице, связанной с 2 ​​обновленными полями.

Отключение EnableViewState в Listviews разрешило его для меня!