如何关闭ASP.NET必需的字段验证器“丢失焦点”行为

时间:2010-06-23 14:07:56

标签: asp.net validation

我有一些代码,我需要两个单独的必需字段验证器用于一个控件,它们都在单独的验证组中,然后由两个单独的按钮进行验证。

单击按钮时这种方法很有效但两个验证器都显示我是否在文本框中输入了一个值然后将其删除。

有没有办法让这个“迷失焦点”验证关闭?我只需要它来验证点击按钮的时间。

修改

不幸的是,如果我设置EnableClientScript = false,那么我没有任何客户端通知。我想要的是显示动态错误消息(有效地显示在按钮的OnClientClick事件中),而不是文本框的“丢失焦点”。

我有什么办法可以禁用或“解开”lostfocus客户端事件吗?

修改

组合dDejan的回答和womp的回答者here完美地排序了问题。

我的最终代码看起来像这样(对于有类似情况的其他人)......

...的Javascript

<script type="text/javascript">

    $(document).ready(function() {
        $('body').fadeIn(500);

        //Turn off all validation = its switched on dynamically
        $.each(Page_Validators, function(index, validator) {
                ValidatorEnable(validator, false);
        });
    });

    function ToggleValidators(GroupName) {

        $.each(Page_Validators, function(index, validator) {
            if (validator.validationGroup == GroupName) {

                ValidatorEnable(validator, true);

            } else {
                ValidatorEnable(validator, false);
            }
        });
    }

</script>

ASPX控制示例......

<telerik:RadTextBox Width="196px" ID="txtFirstName" runat="server" MaxLength="50" Skin="Black"></telerik:RadTextBox>
<asp:RequiredFieldValidator ID="valFirstName" CssClass="Validator" runat="server" EnableClientScript="true" Display="Dynamic" ErrorMessage="You  must enter your first name." ControlToValidate="txtFirstName" ValidationGroup="NeededForEmail"></asp:RequiredFieldValidator>
<asp:RequiredFieldValidator ID="RequiredFieldValidator1" CssClass="Validator" runat="server" EnableClientScript="true" Display="Dynamic" ErrorMessage="You  must enter your first name." ControlToValidate="txtFirstName" ValidationGroup="NeededForSubmit"></asp:RequiredFieldValidator>

ASPX按钮代码......

<asp:Button ID="btnGetConfCode" runat="server" Text="Get Confirmation Code" OnClientClick="ToggleValidators('NeededForEmail')" OnClick="btnGetConfCode_Click" Width="100%" ValidationGroup="NeededForEmail"/>

<asp:Button ID="btnRegisterUser" runat="server" Text="Register" OnClientClick="ToggleValidators('NeededForSubmit')" OnClick="btnRegisterUser_Click" Width="100px" ValidationGroup="NeededForSubmit" />

因此,现在没有验证,直到用户点击“获取电子邮件确认码”按钮或“注册”按钮。

如果他们点击“获取电子邮件确认码”按钮,则所有控件都会在用户输入电子邮件验证码的文本框中进行验证,我们只会看到一条验证码消息。

如果他们单击“注册”按钮,则所有控件都会生效,我们只会看到一条验证消息。

如果按下任一按钮,用户返回,添加然后删除一些文本,然后我们只看到一个验证器。在此更改之前,您曾经看到两条消息都说同样的事情。

谢谢你的帮助

8 个答案:

答案 0 :(得分:5)

您可以使用ValidatorEnable功能设置验证器是否处于“活动”状态与客户端代码。基本上它就像这样

var validator = document.getElementById('<%=Validator1.ClientID%>');
ValidatorEnable(validator , state); //where state is boolean

您还可以使用ValidatorValidate(validator)功能触发验证程序验证某些事件(例如单击按钮)。

我不确定哪种方法可以更好地工作(启用/禁用验证器或自定义触发验证)但我建议这篇文章将指导您正确的方向

ASP.NET Validation in Depth

答案 1 :(得分:2)

如果EnableClientScript = true,则无法解开它们。

您可以做的是将其设置为false。然后创建一个javascript验证方法,该方法在您的提交按钮onClientClick事件上调用。

在您的方法中,您必须为要验证客户端的每个控件调用ValidatorValidate(control)

这里有一个例子:

http://msdn.microsoft.com/en-us/library/Aa479045#aspplusvalid_clientside

答案 2 :(得分:0)

您可以通过设置EnableClientScript =“false”来关闭javascript验证,这将消除丢失的焦点验证。

答案 3 :(得分:0)

您可以使用自定义验证器控件,并使用客户端上的Javascript或服务器上的事件处理程序验证输入。确保在验证控件上设置ValidateEmptyText =“true”,否则事件不会在空字段上触发。

答案 4 :(得分:0)

尝试启用两个按钮,使用javascript单击并在文本框模糊事件上禁用它。

答案 5 :(得分:0)

var validator = document.getElementById('<%=Validator1.ClientID%>');
ValidatorEnable(validator , state); 

它在javascript中工作,但是当我们使用page.Isvalid服务器端的功能时,它会创建检查页面有效的问题。

答案 6 :(得分:0)

尝试重置输入控件的onchange事件。

$(document).ready(function () {
        $("#controlid").each(function () { this.onchange = null; })
    });

答案 7 :(得分:0)

只需在page_load事件

中输入此代码即可
textboxname.Attributes.Add("onblur","ValidatorOnChange(event);");