Не удалось загрузить viewstate.Дерево управления, в которое загружается состояние просмотра, должно соответствовать дереву управления, которое использовалось для сохранения состояния просмотра - PullRequest
8 голосов
/ 02 марта 2011

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

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

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

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

Цикл ->

Страница (Control A) выполняет постбэк с переменной для изменения элемента управления на 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, но это либо отключает внутренние функции управления, такие как обработчики и т. Д., Либо генерирует ту же ошибку состояния представления.

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

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

И переход от Page_Load -> Page_Init вызвал ту же ошибку.

Ошибка:

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

Ответы [ 3 ]

5 голосов
/ 02 марта 2011

В вашем случае, Андерс, вам все равно нужно добавить старый элемент управления на страницу в методе 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);
    }

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

2 голосов
/ 20 апреля 2012

Из-за чего я недавно столкнулся с той же проблемой.

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

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

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

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

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

Это вызвало конфликт и ошибку.

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

2 голосов
/ 02 марта 2011

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

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

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

Страница PreRender

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...