【问题标题】:asp.net CustomValidator on multiple controls多个控件上的 asp.net CustomValidator
【发布时间】:2010-10-06 23:21:30
【问题描述】:

我正在处理一个包含一系列复选框的页面,必须至少选中一个复选框。

当我单击提交按钮时验证器会触发,如果没有选中任何复选框,则表明验证失败。但是,如果我选中其中一个复选框,则验证消息不会消失,直到我再次单击提交按钮。

如果我在指定了 ControlToValidate 的控件上使用它并修复了验证问题,则错误消息会立即消失。

但是在这种情况下,由于需要验证几个独立的控件,我没有设置 ControlToValidate。

所以我的问题是我可以重新验证自定义验证器吗?例如,我想在每个复选框上添加一个 onclick="revalidate()" ,然后强制验证再次发生。

这是我为演示该场景而编写的一些示例代码。

<script type="text/javascript">
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
    function IsOneCheckboxChecked(sender, args) {
        if (!$('[id$=checkBox1]').attr('checked') &&
    !$('[id$=checkBox2]').attr('checked')) {
            args.IsValid = false;
        }
        else {
            args.IsValid = true;
        }
    }
</script>



<asp:CheckBox ID="checkBox1" runat="server" />
<br />
<asp:CheckBox ID="checkBox2" runat="server" />
<br />
<asp:CustomValidator ID="customValidatorMustBeOnCheckboxChecked" 
    runat="server" ClientValidationFunction="IsOneCheckboxChecked"
    ErrorMessage="You must select at least one checkbox option" 
    OnServerValidate="customValidatorMustBeOnCheckboxChecked_ServerValidate" />
<br />
<br />
<asp:Button ID="buttonSubmit" runat="server" Text="Submit" />

【问题讨论】:

  • 在您的 CustomValidator 标签中,您是否尝试过包含 Display="Dynamic" ?
  • 显示仅确定错误消息的位置是静态的还是动态的。但是,我继续尝试了您的建议,但没有任何作用。

标签: .net asp.net


【解决方案1】:

是的,有一种方法可以在单击提交之前重新验证。 ASP.NET 构建一个“onBlur”事件,该事件绑定到您在 javascript 中验证的控件,该事件运行您在客户端验证函数中定义的代码。这正在运行,但您当然是在单击一个复选框然后再次提交 - onBlur 仅在您在清除消息之前单击其他地方时才会启动。因此,在用户到达提交按钮之前,我会在 mouseleave 或 mouseover 事件上调用您的客户端验证函数。这将清除消息并保持您的 args.IsValid 设置正确,因此当用户单击提交时,错误消息已经消失并且表单验证。

例如:

$(".submitButtonDiv").mouseenter(function () {
    IsOneCheckboxChecked();
});

【讨论】:

    【解决方案2】:

    嗯,我能够通过找到控制验证器创建的跨度并在我的重新验证方法中隐藏或公开错误消息来解决问题。但是我想认为存在更好的东西?

    我为此创建了一个博客条目:

    http://coding.infoconex.com/post/ASPNET-CustomValidator-that-validates-multiple-controls-using-both-Server-Side-and-Client-Side-scripting.aspx

     function Revalidate() {
            if (!$('[id$=checkBox1]').attr('checked')
            && !$('[id$=checkBox2]').attr('checked')) {
                var control = $('[id$=customValidatorMustBeOnCheckboxChecked]');
               control.css('display', 'inline');
            }
            else {
                var control = $('[id$=customValidatorMustBeOnCheckboxChecked]');
                control.css('display', 'none');
            }
        }
    
    <asp:CheckBox ID="checkBox1" runat="server" onclick="Revalidate()" />
    <br />
    <asp:CheckBox ID="checkBox2" runat="server" onclick="Revalidate()" />
    

    【讨论】:

    • 肯定有更好的方法吗?没有?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-27
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    相关资源
    最近更新 更多