Подтвердите выбранное значение из выпадающего списка

#asp.net #drop-down-menu

#asp.net #выпадающее меню

Вопрос:

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

Допустим, DDL имеет значения 1 и 2.

  • Выбрано значение 1 (по умолчанию).
  • Пользователь выбирает значение 2. Появится диалоговое окно подтверждения.
  • Если пользователь выбирает «Да», то выбранный элемент изменяется. Должен быть выполнен некоторый код на стороне сервера.
  • Если пользователь выбирает «Нет», то выбранному элементу возвращается значение 1. Код на стороне сервера не выполнен.

У меня много проблем с этим, поскольку в DDL мало событий для использования.

Пока я получил

 this.MyDropDown.Attributes["onChange"] = @"return confirm('Are you sure?');";
  

и event handler для SelectedIndexChanged события DDL для кода на стороне сервера.

Но у меня возникли проблемы с тем фактом, что я не могу ни остановить (или отменить) изменяемый элемент, ни запускаемое SelectedIndexChanged событие.

Есть предложения?

Ответ №1:

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

добавьте эту функцию javascript

 function handleChange(opt) {
    if (!confirm('are you sure')) {
        opt.selectedIndex = opt.oldIndex;
    }
    else {
        __doPostBack('MyDropDown','')
    }
}
  

и установите события на стороне клиента следующим образом

 this.MyDropDown.Attributes["onChange"] = "handleChange(this)";
this.MyDropDown.Attributes["onFocus"] = "this.oldIndex = this.selectedIndex";
  

Комментарии:

1. Потрясающе!!! Это именно то, что мне было нужно. Убедитесь, что вы отключили AutoPostBack = True при использовании этого, потому что предложение else делает это за вас.

Ответ №2:

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

 // Paste it in Aspx file
function handleChange(opt) {
    if (!confirm('Are you sure?')) {
        opt.selectedIndex = opt.oldIndex;
    }
    else {
        __doPostBack('MyDropDown','')
    }
}
  

Вставьте это в событие загрузки страницы за пределами IsPostBack:

 this.MyDropDown.Attributes["onChange"] = "handleChange(this)";
this.MyDropDown.Attributes["onFocus"] = "this.oldIndex = this.selectedIndex";
  

Примечание: Установите для выпадающего списка значение AutoPostBack False.