ASP.NET/VB.NET : Выпадающий список SelectedIndexChanged не запускается с помощью onchange=»javascript:возвращает true;»

#javascript #asp.net #events #drop-down-menu #onchange

#javascript #asp.net #Мероприятия #выпадающее меню #onchange

Вопрос:

У меня есть следующая разметка:

 <asp:DropDownList ID="dd1" AutoPostBack="true" runat="server">
    <asp:ListItem Value="1">1</asp:ListItem>
    <asp:ListItem Value="2">2</asp:ListItem>
</asp:DropDownList>
<asp:DropDownList ID="dd2" AutoPostBack="true" onchange="javascript:return true;" runat="server">
    <asp:ListItem Value="1">3</asp:ListItem>
    <asp:ListItem Value="2">4</asp:ListItem>
</asp:DropDownList>
  

Подключенный к этому:

 Protected Sub changed1(sender As Object, e As EventArgs) Handles dd1.SelectedIndexChanged

End Sub

Protected Sub changed2(sender As Object, e As EventArgs) Handles dd2.SelectedIndexChanged

End Sub
  

При изменении индекса dd2 вы ожидаете, что его обработчик сработает, верно? Ну, это не так. Вместо этого он попадает в очередь и запускается после срабатывания обработчика dd1 при изменении его индекса. Если вы onchange="javascript:return true;" отключите dd2, он сработает просто отлично.

Кто-нибудь имеет представление о том, что здесь происходит?

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

Обновление: я могу принудительно запустить событие сервера, выполнив это в Javascript:

__doPostBack("<%=dd2.ClientID %>", '');

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

Ответ №1:

Вам это вообще не нужно. Просто установите AutoPostBack значение true, и если вам нужно избежать проверки, установите CausesValidation значение false.

 <asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="true" CausesValidation="false" OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged" />
  

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

1. Вы спрашиваете меня, используете ли вы проверку? Если у вас есть средства проверки на странице, но вы не хотите, чтобы выпадающий список запускал проверку, установите CausesValidation значение false . В противном случае просто установите AutoPostBack значение true, и все будет хорошо.

2. Мой пример показывает, что у меня уже есть AutoPostBack=»true». Я также вообще ничего не делаю с проверкой. Я просто не хочу, чтобы событие на стороне сервера срабатывало вообще в зависимости от того, возвращаю ли я true или false.

3. Возможно, я в замешательстве… что вы пытаетесь сделать и в чем проблема?

4. AutoPostBack="true" помогло мне решить проблему с моей стороны.

Ответ №2:

По какой-то причине я подумал, что вы можете отменить событие сервера выпадающего списка, вернув false в событии onchange на стороне клиента, как вы могли бы с помощью события onclick кнопки (например, onclick="javascript:return false;" ).

В итоге я проверил условие в функции. Если true, он запускает это:

__doPostBack(«<%=dd2.ClientID %>», «);

В противном случае это не так.

Ответ №3:

 <asp:DropDownList ID="page_size" runat="server" **AutoPostBack="true"** OnSelectedIndexChanged="page_size_SelectedIndexChanged">
                            </asp:DropDownList>
  

Добавление Autopostback="true сделало свое дело для меня.

Ответ №4:

 __doPostBack("<%=dd2.ClientID %>", '');
  

Это сработало для меня.

Это был мой выпадающий список:

 <asp:DropDownList ID="ddlbranchname" runat="server" AutoPostBack="true" OnSelectedIndexChanged="ddlBranchChanged" 
onchange="return CheckDate();" CausesValidation="false" CssClass="dropdown">
</asp:DropDownList>
  

Вот моя функция jquery:

 function CheckDate() {
    var date = document.getElementById('<%= ucDateTimeStart.FindControl("txtDateTime").ClientID %>').value;
    if (date == '') {
        alert("Please select a valid date.");
        return false;
    }
    else {
        __doPostBack("<%=ddlbranchname.ClientID %>", '');
        return true;
    }
    return true;
}