ASP.NET/VB.NET: выпадающий список SelectedIndexChanged не срабатывает с onchange = "javascript: return true;" - PullRequest
4 голосов
/ 27 октября 2011

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

<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 %>", '');

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

Ответы [ 4 ]

5 голосов
/ 27 октября 2011

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

<asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="true" CausesValidation="false" OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged" />
2 голосов
/ 09 ноября 2011

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

Что я закончилвыполнение проверяет условие в функции.Если это правда, он запускает это:

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

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

1 голос
/ 21 июня 2013
__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;
}
1 голос
/ 18 мая 2012
<asp:DropDownList ID="page_size" runat="server" **AutoPostBack="true"** OnSelectedIndexChanged="page_size_SelectedIndexChanged">
                            </asp:DropDownList>

Добавить Autopostback="true помогло мне.

...