Автопост в раскрывающемся списке внутри панели обновления никогда не вводит код после события SelectedIndexChanged
Это сложный сценарий для объяснения, поэтому я привел простой пример.
<asp:UpdatePanel runat="server" ID="upTest" ChildrenAsTriggers="true"
UpdateMode="Conditional">
<ContentTemplate>
<asp:DropDownList ID="ddlTest" runat="server" AutoPostBack="true"></asp:DropDownList>
<br /><br />
In page: <asp:TextBox runat="server" ID="txtTest" Columns="50" Text="OnLoad</asp:TextBox>
<br />
<br />
<asp:Button runat="server" ID="btnTest" Text="Click it" />
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="ddlTest" />
</Triggers>
</UpdatePanel>
Code-Behind
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Page.IsPostBack Then
BindDropDown(Request.Form(ddlTest.UniqueID))
Else
BindDropDown(0)
End If
End Sub
Public Sub BindDropDown(val As Integer)
ddlTest.Items.Add(New ListItem("", 0))
ddlTest.Items.Add(New ListItem("One", 1))
ddlTest.Items.Add(New ListItem("Two", 2))
ddlTest.Items.Add(New ListItem("Three", 3))
ddlTest.Items.Add(New ListItem("Four", 4))
ddlTest.SelectedValue = val
End Sub
Private Sub ddlTest_SelectedIndexChanged(sender As Object, e As System.EventArgs) Handles ddlTest.SelectedIndexChanged
txtTest.Text = "Dropdown changed"
End Sub
Private Sub btnTest_Click(sender As Object, e As System.EventArgs) Handles btnTest.Click
txtTest.Text = "Button clicked"
End Sub
Также, чтобы отметить, у меня есть EnableViewState="false" и ClientIdMode="Static" для страницы.
Когда я нажимаю кнопку, происходит частичная обратная передача, и текстовое поле имеет ожидаемое значение "Нажатие кнопки"
Когда я изменяю раскрывающийся список, происходит частичная обратная передача, однако текстовое поле не имеет ожидаемого значения "Измененный раскрывающийся список", поскольку код в ddlTest_SelectedIndexChanged никогда не срабатывает (размещение точек останова на этой строке кода также никогда не выполняется)
В более широком масштабе моего проекта это суть проблемы, и я не могу определить, почему это событие никогда не срабатывает (основная проблема заключается в том, что когда я загружаю динамический пользовательский элемент управления, данные в элементе управления связаны правильно, но затем перезаписывается данными перед публикацией после загрузки пользовательского элемента управления - переопределение происходит где-то в событиях обратной отправки). Мне кажется, это как-то связано с привязкой выпадающего списка и тем, где это происходит в цикле страниц, но я не смог ничего пригвоздить и не нашел решений Google.
Одна странная вещь, которую я заметил при просмотре сообщения в Firebug, - значение EVENTTARGET для раскрывающегося списка - это уникальный идентификатор раскрывающегося списка, но значение EVENTTARGET для нажатия кнопки пустое. Мой мозг думает, что здесь есть какая-то связь.
К вашему сведению - я придумал работу, которая, кажется, делает свое дело. Я устанавливаю autopostback on dropdown в false, и, используя jQuery, я назначаю событие change в раскрывающемся меню для запуска нажатия кнопки - что вызывает обратную передачу и запускает событие btn_click в коде.
1 ответ
Я решил первоначальную проблему, переместив раскрывающуюся заливку в событие init, а затем разрешив.NET загрузить выбранное значение из состояния просмотра.
Однако при этом теперь событие selectedindex срабатывает при КАЖДОЙ обратной передаче.