Отключить загрузку состояния просмотра для дочерних элементов управления

У меня есть много веб-элементов управления, динамически создаваемых на странице ASP.NET. В определенных сценариях обратной передачи (когда я нажимаю LinkButton) я хочу пропустить загрузку старого дерева веб-элементов управления и немедленно создать новое дерево. К сожалению, когда я создаю новое дерево, в него загружается состояние просмотра старого дерева.

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

Я уже решил часть проблемы, переопределив метод LoadViewState веб-элементов управления, но, к сожалению, это отключает состояние просмотра, специфичное для элемента управления, а не для его дочерних элементов (текстовые поля, кнопки и т. Д.).

Является ли это возможным?

Спасибо.


person Florin Sabau    schedule 04.11.2009    source источник


Ответы (3)


Вы можете попробовать создать новое дерево после загрузки состояния просмотра, например в Page_Load.

person Per Erik Stendahl    schedule 04.11.2009
comment
Да, я действительно загружаю новые элементы управления в событие LinkButton.Clicked, которое происходит после Page_Load, но, как работает ASP.NET, загрузка состояния просмотра будет отложена до тех пор, пока вы не загрузите новые элементы управления в корневой элемент управления (тот, у которого есть все родительские элементы). путь до Страницы). - person Florin Sabau; 04.11.2009
comment
Ах, динамически добавленные элементы управления. Это всегда такой беспорядок ... :) Я не знаю, как структурирован ваш код, но, может быть, вы можете подключиться к событию загрузки динамических элементов управления и создать новое дерево в этом обработчике? - person Per Erik Stendahl; 04.11.2009
comment
Не совсем уверен, что вы имели в виду, говоря о подключении к событию загрузки динамических элементов управления и создании нового дерева в этом обработчике. - person Florin Sabau; 05.11.2009

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

tree.nodes.clear()

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

tree.Nodes.Add(New TreeNode("name of node"))

Теперь для обычных элементов управления, которые, как я понимаю, вы используете, вы столкнетесь с целым рядом проблем, если не используете viewstate. Вы можете удалить их из дерева управления аналогичным образом, используя controlname.controls.clear. Проблема в том, что вы в первую очередь добавляете эти элементы управления или вы не хотите нести бремя состояния просмотра? Я предлагаю, чтобы в последнем случае вы очистили свои элементы управления программно и где-нибудь сохранили серверную часть viewstate, чтобы ее можно было загрузить из памяти, а не использовать вашу полосу пропускания.

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

person Middletone    schedule 04.11.2009
comment
Я действительно не использую дерево. Когда я говорил о дереве, я имел в виду дерево элементов управления, которое я добавляю динамически. Проблема, которую я пытаюсь избежать, заключается в создании очень трудоемкого списка элементов управления LinkButton.Click только для того, чтобы сделать asp.net счастливым и загрузить состояние просмотра, а затем забыть о них и воссоздать с новым набором элементов управления. Я пытаюсь избежать первого шага. Обычно я бы не стал заходить так долго, чтобы изменить нормальное поведение создания динамических элементов управления asp.net, но, как я уже сказал, эта операция в данном случае занимает довольно много времени, и я хочу полностью ее избежать. - person Florin Sabau; 05.11.2009