Переменная Viewstate потеряна в пользовательском элементе управления, загруженном динамически - PullRequest
6 голосов
/ 12 февраля 2010

У меня проблема с ViewState. У меня есть страница aspx, которая имеет древовидное представление слева и панель обновления с панелью 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.

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

Может быть, я могу использовать другой метод для хранения этих значений, таких как ввод скрытых полей или кэш. Я выбрал 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);
}

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

Ответы [ 4 ]

3 голосов
/ 13 февраля 2010

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

3 голосов
/ 13 февраля 2010

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

0 голосов
/ 13 февраля 2010

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

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

PreLoad:

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

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

0 голосов
/ 12 февраля 2010

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

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

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