Почему нужно дважды нажать на кнопку управления?
У меня есть веб-приложение, работающее с использованием VB и Ajax. Я использую панели обновления, чтобы избежать раздражающего "мерцания" при обратной передаче на сервер.
Мне бы хотелось, чтобы в самой панели обновлений был определен элемент управления кнопками (попытался переместить его наружу и получил какую-то катастрофическую ошибку, поэтому оставил его там), который делает текущую панель невидимой, а панель родного элемента - видимой. Это работает за исключением того, что кнопка должна быть нажата дважды. Не дважды щелкнул, но щелкнул один раз, чем щелкнул снова.
При установке точек останова я обнаружил, что код, прикрепленный к кнопке, фактически выполняется при первом нажатии, но панели не переключаются должным образом. Если я нажимаю ту же кнопку ИЛИ еще хуже, другую кнопку, происходит ожидаемое поведение второй панели. Однако, при нажатии второй кнопки появляется нежелательный бонус отображения третьей панели, причем третья панель становится видимой из-за нажатия второй кнопки.
Я предполагаю, что такое поведение связано с панелью обновления и ее характером Ajax. Есть ли способ избежать второго клика? Я неправильно использую панель обновления? Я действительно хотел использовать модальное всплывающее окно (прямо из AjaxToolKit), но у меня были проблемы с отправкой данных назад, поэтому я выбрал этот подход. Любые идеи, помощь, даже критика приветствуются, поскольку это мучает меня достаточно долго. Спасибо
8 ответов
Если вы избавитесь от UpdatePanels, все ли будет работать как положено с PostBacks? Скорее всего, что-то в вашем Page_Load или в другом событии, находящемся выше по цепочке, каким-то образом "сбрасывает" вещи, прежде чем они попадут в событие щелчка. Может ли это быть так?
Я думаю, что ваша проблема в том, что только панель обновлений получает данные с сервера после выполнения метода. Панель, которую вы пытаетесь изменить, находится за пределами панели обновления, поэтому она не знает, что ее свойства изменились.
Вам либо нужно выполнить постбэк на всю страницу, либо панель, которую вы хотите изменить, внутри панели обновлений.
Я обнаружил, что это происходит при 2 различных сценариях:
Идентификатор не установлен на элементе управления. Либо идентификатор оставлен вне разметки, либо идентификатор не был установлен при создании динамического элемента управления. ASP.Net использует идентификатор для отслеживания действий.
Вложенные панели обновления. Сценарий. При использовании главной страницы у вас может быть заполнитель содержимого, который вы оборачиваете в UpdatePanel, так что UpdatePanel не требуется для содержимого на странице. Затем, при разработке своей страницы, вы можете, как обычно, добавить UpdatePanel.
Как уже говорили другие, панель обновлений только обновляет свое содержимое, что является одним из основных преимуществ его использования.
Panel2 и pnlPrvCmt должны быть внутри вашей панели обновления, чтобы ваш метод нажатия кнопки работал. Другой вариант - поместить Panel2 внутри одной панели обновлений, а pnlPrvCmt - во вторую панель обновлений. Тогда любой элемент управления внутри любой панели обновлений будет вызывать обновление обоих, если UpdateMode=Always (что по умолчанию).
Ваша панель обновления находится внутри других панелей.
Должно ли это быть наоборот? AFAIK только элементы управления на панели обновлений будут обновляться через вызов AJAX.
Вот довольно простое решение. (У меня была та же проблема этим утром.)
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 (например, изменяя их состояние на отключено или включено). Полный постбэк происходит только при нажатии кнопок.
Попробуйте дать динамическому элементу управления идентификатор при его создании.
По какой-то причине.net требуется для динамического управления для работы в этом контексте.
myControl.id="newID"
Я сталкивался с этим раньше и решил, я просто не могу вспомнить как. Я постараюсь найти свой старый код и перезвоню вам. Одна мысль, у вас включен EnablePartialRendering в вашем скрипт-менеджере? возможно попробуйте обернуть оба контейнера в третью панель.