ASP.NET/VB.NET:使用onchange="javascript:return true;"时,下拉列表的SelectedIndexChanged事件不触发。

4

I have the following markup:

<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个回答

8
你根本不需要那个。只需将AutoPostBack设置为true,如果需要跳过验证,则将CausesValidation设置为false。
<asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="true" CausesValidation="false" OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged" />

你是在问我是否正在使用验证吗?如果页面上有验证器,但你不想让 DropDownList 触发验证,将 CausesValidation 设置为 false。否则,只需将 AutoPostBack 设置为 true,一切都会顺利的。 - James Johnson
我的示例显示我已经设置了AutoPostBack="true"。我也没有进行任何验证。我只是希望根据返回的true或false来决定是否触发服务器端事件。 - oscilatingcretin
也许我有点困惑...你想做什么?有什么问题吗? - James Johnson
AutoPostBack="true" 帮助我解决了我的问题。 - AceMark

2

由于某些原因,我以为可以像按钮的onclick事件一样在客户端的onchange事件中返回false来取消下拉菜单的服务器事件(例如:onclick="javascript:return false;")。

最终我做的是在一个函数中检查条件。如果为真,则触发以下操作:

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

否则,不执行。


1
__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
<asp:DropDownList ID="page_size" runat="server" **AutoPostBack="true"** OnSelectedIndexChanged="page_size_SelectedIndexChanged">
                            </asp:DropDownList>

对我来说,添加Autopostback="true"就解决了问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接