Почему нужно дважды нажать кнопку управления? - PullRequest
2 голосов
/ 04 сентября 2008

У меня есть веб-приложение, работающее с использованием VB и Ajax. Я использую панели обновления, чтобы избежать раздражающего «мерцания» при обратной передаче на сервер.

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

При установке точек останова я обнаружил, что код, прикрепленный к кнопке, фактически выполняется при первом щелчке, но панели не переключаются должным образом. Если я нажму ту же кнопку ИЛИ еще хуже, другую кнопку, произойдет ожидаемое поведение второй панели. Однако при нажатии второй кнопки появляется нежелательный бонус отображения третьей панели, причем третья панель становится видимой из-за нажатия второй кнопки.

Я предполагаю, что такое поведение связано с панелью обновления и ее характером Ajax. Есть ли способ избежать второго клика? Я неправильно использую панель обновления? Я действительно хотел использовать модальное всплывающее окно (прямо из AjaxToolKit), но у меня были проблемы с отправкой данных назад, поэтому я выбрал этот подход. Любые идеи, помощь, даже критика приветствуются, поскольку это мучает меня достаточно долго. Спасибо

Ответы [ 8 ]

1 голос
/ 05 сентября 2008

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

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

1 голос
/ 04 сентября 2008

Если вы избавляетесь от UpdatePanels, все ли работает как положено с PostBacks? Скорее всего, что-то в вашем Page_Load или в другом событии, находящемся выше по цепочке, каким-то образом «сбрасывает» вещи, прежде чем они попадут в событие щелчка. Может ли это быть так?

0 голосов
/ 09 ноября 2014

Я обнаружил, что это происходит при 2 разных сценариях:

  1. Идентификатор на контроле не установлен. Либо идентификатор оставлен вне разметки, либо идентификатор не был установлен при создании динамического элемента управления. ASP.Net использует идентификатор для отслеживания действий.

  2. Вложенные панели обновления. Сценарий. При использовании главной страницы у вас может быть заполнитель содержимого, который вы оборачиваете в UpdatePanel, так что UpdatePanel не требуется для содержимого на странице. Затем, при разработке своей страницы, вы, как обычно, можете добавить UpdatePanel.

0 голосов
/ 19 декабря 2013

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

myControl.id="newID"
0 голосов
/ 06 ноября 2008

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

Panel2 и pnlPrvCmt должны быть внутри вашей панели обновления, чтобы ваш метод нажатия кнопки работал. Другой вариант - поместить Panel2 внутри одной панели обновлений, а pnlPrvCmt - во вторую панель обновлений. Тогда любой элемент управления внутри любой панели обновлений будет вызывать обновление обоих, если UpdateMode = Always (что по умолчанию).

0 голосов
/ 03 ноября 2008

Вот довольно простое решение. (У меня была такая же проблема сегодня утром.)

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

Самое простое решение - форсировать обратную передачу. Вы можете сделать это так:

protected override void OnInit(EventArgs e)
{
    var scriptManager = ScriptManager.GetCurrent(this);
    // or this.Page in a UserControl, etc.

    scriptManager.RegisterPostBackControl(someButton);
    scriptManager.RegisterPostBackControl(someOtherButton);
    // etc. for each control that needs to update something outside the UpdatePanel
}

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

0 голосов
/ 04 сентября 2008

Ваша панель обновления находится внутри других панелей.

Должно ли это быть наоборот? Только элементы управления AFAIK на панели обновлений будут обновляться через вызов AJAX.

0 голосов
/ 04 сентября 2008

Я сталкивался с этим раньше и решил, просто не помню как. Я постараюсь найти свой старый код и перезвоню вам. Одна мысль, у вас включен EnablePartialRendering в вашем скрипт-менеджере? возможно попробуйте обернуть оба контейнера в третью панель.

...