即使CauseValidation默认为false,也会在DropDownList上触发ASP.NET ValidatorOnChange

时间:2012-02-13 17:21:24

标签: asp.net drop-down-menu requiredfieldvalidator

此处的用例是将AutoPostBack设置为true的下拉列表,该列表会更新页面上的其他项目。但是,单击“提交”按钮时,同样的下拉列表也是ValidationGroup中必需项的一部分。

我们面临的问题是,当下拉列表发生更改时,会触发ValidatorOnChange,因此会在回发刷新页面之前短暂显示错误。

我们计划做的修复是删除下拉列表的ValidatorOnChange函数,但这看起来像是一个奇怪的黑客,所以我们想知道是否有人有任何其他建议。

这是一个非常简单的列表,用于演示问题:

<%@ Page Language="C#" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script runat="server">

    private void OnChange(object sender, EventArgs e)
    {
        updateList.Visible = test.SelectedValue == "1";
        updateList2.Visible = test.SelectedValue == "2";
    }

    private void OnSubmit(object sender, EventArgs e)
    {
        if (Page.IsValid)
        {

        }
    }

</script>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:DropDownList runat="server" ID="test" AutoPostBack="true" OnSelectedIndexChanged="OnChange">
            <asp:ListItem Text="Test" Value="-1" />
            <asp:ListItem Text="Test 1" Value="1" />
            <asp:ListItem Text="Test 2" Value="2" />
            <asp:ListItem Text="Test 3" Value="3" />
        </asp:DropDownList>
        <asp:RequiredFieldValidator ID="DropDownListValidator2" runat="server" ControlToValidate="test"
            ErrorMessage="Please select" InitialValue="-1" ValidationGroup="testGroup" />
        <asp:DropDownList runat="server" ID="updateList" Visible="false" />
        <asp:DropDownList runat="server" ID="updateList2" Visible="false" />
        <asp:Button runat="server" ID="testSubmit" Text="Submit" ValidationGroup="testGroup"
            OnClick="OnSubmit" />
    </div>
    </form>
</body>
</html>

1 个答案:

答案 0 :(得分:0)

以下jquery脚本块应该适合您。从Dropdownlist中选择项目时,使用ValidatorEnable()禁用验证将会起到作用

这里我将更改处理程序与下拉列表的onchange客户端事件绑定

$("#<%=test.ClientID %>").change(function(){
    ValidatorEnable(DropDownListValidator2, false);

});