Не удалось загрузить viewstate. Дерево элементов управления, в которое загружается viewstate, должно соответствовать дереву элементов управления, использованному для сохранения viewstate

в настоящее время я работаю над динамическим ядром для нескольких веб-проектов. Он имеет ядро, которое использует treeview и меню. И затем для каждого конкретного проекта он загружает несколько разных wuc в maincontent. Некоторые бизнес-проекты, связанные КВП бизнеса, в то время как другие использует разные люди. Так что пролет ОПВ действительно большой.

теперь к моей проблеме, когда пользователь нажимает menuitem или treeitem, он загружает wuc в maincontent, связанный с этим объектом.

но я имея некоторые ошибки viewstate, и я искал вокруг в течение 2 дней, и ни одно из объясненных решений не работает для моего проекта.

все мои wuc должны иметь включенное viewstate.

цикл ->

Page(Control A) выполняет обратную передачу с переменной для изменения control на ControlB в wucPanel (UpdatePanel). OnLoad LoadRequested Wuc.

текущий код

protected void Load_Page(object sender, EventArgs e)
{
//Code to decide which wuc to load.
 UserControl wucc = (UserControl)Page.LoadControl(sFilePath);        
 ParentControl.ContentTemplateContainer.Controls.Add(wucc);
}

Я пробовал несколько исправлений, таких как добавление различных идентификаторов в wuc, но это либо disabels функций внутреннего контроля, как обработчики и т. д. или создает та же ошибка отображение.

одним из решений, которое я нашел, было загрузить ControlA, а затем просто удалить его, а затем загрузить ControlB. Но это отключило скрипты для моего стороннего контроллера (Telerik).

Я также читал о наличии различных заполнителей для каждого типа, но так как я ожидаю havign до 50 различных элементов управления, я не чувствую, что это поможет мне.

и двигаясь от В -> В автоматически одну и ту же ошибку.

ошибка:

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

3 ответов


в вашем случае Anders вам все равно нужно добавить старый элемент управления на свою страницу в методе init вместе с новым элементом управления, который вы хотите добавить. Сохранить ссылку на этот старый элемент управления, который вы только что добавили в переменную уровня класса. Что-то вроде

    Control _oldControl = null;
    protected void Init_Page(object sender, EventArgs e)
    {
    //Code to decide which wuc to load.
     UserControl wucc = (UserControl)Page.LoadControl(sFilePath);        
     ParentControl.ContentTemplateContainer.Controls.Add(wucc);
     _oldControl = wucc as Control;
    //Now add the new control here.
    }

   //override the LoadViewState method and remove the control from the control's collection     once you page's viewstate has been loaded 
    protected override void LoadViewState(object savedState)
    {
            base.LoadViewState(savedState);
            ParentControl.ContentTemplateContainer.Controls.Remove(_oldControl);
    }

надеюсь, что это помогает. Если это так, установите флажок рядом с этим ответом, чтобы принять его и проголосовать за него, если хотите:)


чтобы избежать ошибок, связанных с ViewState, пожалуйста, убедитесь, что в Page_Init вы создаете то же дерево управления, которое было создано в предыдущий раз, когда ViewState был сохранен, т. е. предыдущая обратная передача. Простой жизненный цикл страницы:

Page Init-создание дерева элементов управления - Состояние просмотра загружается и применяется здесь

загрузка страницы-уже загруженное состояние представления, вы можете внести изменения в дерево элементов управления здесь - Сохранить Состояние Просмотра

Страница PreRender


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

мой сценарий был следующим.

фиксированная панель фильтров (раскрывающиеся списки и текстовые поля), которая построила строку SQL поиска. При отправке поиска последующие результаты были отображены в редактируемом gridview ниже.

при редактировании gridview I cold эффективно изменяет состояние записи базы данных, удаляя ее из gridview под ранее выбранными фильтрами. В некоторых случаях это в результате никаких результатов не возвращается, что заставляет меня скрывать gridview.

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

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

Это, казалось, вызвало конфликт и ошибка.

таким образом, похоже, что в моем случае проблема viewstate возникла из невидимого gridview, который содержал не обновленные данные.