asp.net мой список исчезает при обратной передаче - не могу найти то, что мне не хватает?

Это, наверное, легко, но я не могу понять. ааа...

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

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

У меня есть EnableViewState="true" как на родительской странице, так и в пользовательском элементе управления. Насколько я понимаю, этого будет достаточно, чтобы сохранить мой список вариантов? Если я каждый раз перезагружаю список и перепривязываю свой обработчик событий, я думаю, что тогда событие будет потеряно, верно?

Вот (сокращенный код), где я добавляю элементы управления на свою панель.

    public void LoadMediaOptions() {

      loop through a datareader {

        LinkButton b = new LinkButton();
        b.Click += new EventHandler(navOption_Click);
        b.Attributes.Add("mediaID", mediaID.ToString());

        HtmlImage i = new HtmlImage();
        i.Src = strThumbLink;
        i.Width = 120;
        i.Height = 90;
        b.Controls.Add(i);

        _loadedMediaHtml.Add(b);
        panMediaOptions.Controls.Add(b);
     }
  }

В настоящее время этот метод вызывается только один раз на родительской странице в методе Page_Load:

protected void Page_Load(object sender, EventArgs e)
{
  try
  {        
    if (!Page.IsPostBack)
      uxMediaNav.LoadMediaOptions();
  }
  catch (Exception ex)
  {
    throw ex;
  }
}

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


person gdbj    schedule 27.08.2011    source источник
comment
пожалуйста, опубликуйте свой код... это действительно поможет нам диагностировать.   -  person Chase Florell    schedule 28.08.2011
comment
Выполнено. На самом деле, в качестве шутки, я просто взял метод LoadMediaOptions() вне условного выражения, и мой код работает, как и ожидалось, с корректной загрузкой параметров мультимедиа, но, что более важно, работает обработчик событий, который я совершенно не понимаю. Если параметры мультимедиа очищены, а затем каждый раз должны загружаться вручную, включая перепривязку обработчика событий, то как сервер выясняет, как вызвать событие?   -  person gdbj    schedule 28.08.2011


Ответы (2)


Вы создаете элементы управления слишком поздно в жизненном цикле страницы. ViewState загружается после инициализации и до загрузки. Подробнее о жизненном цикле страницы см. здесь.

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

События управления срабатывают после Load, но до onLoadComplete. Событие фактически передается в запросе и сопоставляется с элементом управления на основе идентификатора. При условии, что элемент управления может быть найден по времени запуска событий управления, событие сработает. Следовательно, события обычно не зависят от ViewState, за исключением событий изменения. События изменения нужны, потому что ASP.NET должна иметь возможность сравнивать исходное значение, сохраненное в ViewState, с текущим значением запроса, чтобы знать, следует ли запускать событие.

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

person TheCodeKing    schedule 27.08.2011
comment
Это имеет большой смысл и объясняет странное поведение, которое я вижу. Я рассмотрю статью, которую вы прислали - спасибо! - person gdbj; 28.08.2011
comment
На моей главной странице в обработчике событий PreInit мой пользовательский элемент управления еще не создан для какой-либо обработки. Он существует только в обработчике событий Init. - person gdbj; 28.08.2011
comment
Эта проблема, похоже, распространяется и на частные переменные, которые я хочу сохранить. Все они сбрасываются до нулевых значений или значений по умолчанию во время обратной передачи. Но только для пользовательского контроля. У меня есть другие обычные элементы управления на странице, которые работают должным образом. - person gdbj; 28.08.2011
comment
Похоже, я сам ответил на свой вопрос. Я не понимал, что нам нужно вручную добавлять/удалять значения во ViewState. Почему-то я думал, что ASP.Net магическим образом сохраняет требуемые значения. Так что дело не во времени, а в том, что я никогда ничего не сохранял в ViewState, чтобы это можно было сохранить через PostBack. Тайна разгадана. Спасибо, что указали мне направление жизненного цикла страницы... это заставило меня прочитать о ViewState и о том, как он на самом деле работает. - person gdbj; 28.08.2011
comment
Когда я говорил о событиях, я имел в виду события в вашем пользовательском элементе управления (а не на странице). Добавление элементов управления к вашему пользовательскому элементу управления в Init — это нормально, я не могу вспомнить, есть ли у элементов управления PreInit (подозреваю, что нет). Элементы управления ASP.NET имеют кодовую магию для ViewState, но да, если вы хотите сохранить свойства в своем пользовательском элементе управления, вам нужно добавить их в ViewState самостоятельно. Рад, что у тебя получилось. - person TheCodeKing; 28.08.2011

Решение простое: поместите changeControl в метод Page_Load.

protected void Page_Load(object sender, EventArgs e)
    {
        changeControl((UserControl)LoadControl("~/user-control.ascx"));
    }
person Dave    schedule 03.04.2013