#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;
}