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

У меня есть проблема с ViewState. У меня есть aspx страница, которая имеет treeview слева и UpdatePanel с Панелью ASP.NET внутри справа. Это находится в той внутренней Панели, где я загружаю и разгружаю динамично пользовательские элементы управления. Я использую ту панель обновления для загрузки динамично средств управления.

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

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

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

Обновление:

Это - часть моего пользовательского элемента управления:

public class MyUserControl : System.Web.UI.UserControl
{
private int PKId
{
    get { return ViewState["pkId"] as int; }
    set { ViewState["pkId"] = value; }
}

public MyUserControl(int pkId)
{
    this.PKId = pkId;
}

...
}

Я следую этой статье к управлению нагрузкой динамично: http://msdn.microsoft.com/en-us/magazine/cc748662.aspx#id0070065.

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

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

Третье обновление:

I load the controls with this code:

System.Web.UI.UserControl baseControl = LoadControl(ucUrl) as System.Web.UI.UserControl;
if (baseControl != null)
{
    baseControl.ID = "DestinationUserControl";
    PanelDestination.Controls.Add(baseControl);
}

И reaload с этим кодом:

DynamicControls.CreateDestination ud = this.LoadControl(TrackedUserControl) as DynamicControls.CreateDestination;
if (ud != null)
{
    ud.ID = "DestinationUserControl";
    PanelDestination.Controls.Add(ud);
}

Что происходит?

6
задан VansFannel 13 February 2010 в 09:17
поделиться

4 ответа

Попробуйте сохранить элемент управления в локальной переменной после его загрузки / создания, прежде чем он будет добавлен в иерархию элементов управления. Это позволяет отображать данные ViewState из элемента управления и в него. См. «Правило 2» здесь http://chiragrdarji.wordpress.com/2009/05/20/maintain-viewstate-for-dynamic-controls-across-the-postback/ .

3
ответ дан 17 December 2019 в 02:28
поделиться

Когда вы загружаете пользовательский элемент управления? Это должно произойти в событии Init, если вы хотите сохранить / восстановить ViewState.

3
ответ дан 17 December 2019 в 02:28
поделиться

Динамическое добавление элементов управления внутри UpdatePanel - плохая идея. Это порождает столько проблем.

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

0
ответ дан 17 December 2019 в 02:28
поделиться

Как упомянул Брайан , вам следует загружать динамические элементы управления в Page_Init, а не в Page_Load.

Как это описание жизненного цикла страницы объясняет, к тому времени, когда происходит событие Page_Load, состояние просмотра из обратной передачи уже было обработано (в PreLoad). Если элементы управления еще не были перезагружены, состояние просмотра некуда.

PreLoad:

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

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

0
ответ дан 17 December 2019 в 02:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: