У меня есть веб-приложение ASP.NET 2.0, которое частично перемещается с помощью элементов управления DropDownList
. Когда один из них изменяется, он вызывает обратную передачу, которая затем перенаправляется на другой URL в зависимости от того, что было выбрано в раскрывающемся списке.
Я заметил странное поведение при использовании кнопки «Назад» браузера после использования выпадающих меню. Процедура такая:
- Сделайте выбор в одном из выпадающих меню, вызывая обратную передачу и перенаправление. Пока все хорошо.
- Нажмите кнопку «Назад» браузера.
- В другом раскрывающемся списке ниже того, который использовался до (они все содержатся в одном
div
), сделайте выбор. Страница перенаправляется на тот же URL-адрес, что и в первый раз, а не на тот, на который она должна перенаправляться, исходя из этого другого раскрывающегося списка.
Я пробовал это и в Firefox 10, и в IE9 и видел одно и то же. Я посмотрел на вкладку Net в Firebug и увидел, что в POST для шага 3 указан правильный элемент управления. Но когда я отлаживаю его, запускается обработчик событий для неправильного раскрывающегося списка (использованного на шаге 1).
Код довольно прост и понятен. Пример разметки:
<asp:DropDownList runat="server" ID="ddlTest" AutoPostBack="true" />
Выпадающие списки на самом деле не являются <asp:DropDownList ... />
элементами; Я вставляю optgroup
элементы с подходом, аналогичным this .
Пример C #:
ddlTest.Click += new EventHandler(ddlTest_SelectedIndexChanged);
А в ddlTest_SelectedIndexChanged
:
if (ddlTest.SelectedValue != "")
{
Response.Redirect(MyUtilClass.GetUrl(ddlTest.SelectedValue));
}
Что здесь происходит?
ОБНОВЛЕНИЕ 2/6/2012 : Я исправил это, проверив содержимое Request["__EVENTTARGET"]
в моих SelectedIndexChanged
обработчиках событий. Мне все еще интересно, почему это происходит. Почему первое событие повторяется? И почему это происходит только тогда, когда второй постбэк происходит из элемента управления ниже первого?