为什么CustomValidator会触发文本框的onblur

时间:2012-11-30 16:38:29

标签: asp.net client-side-validation

我正在构建一个CustomValidator来处理我自己的应用程序的时间字段逻辑(" 09:00"," 15:35",...)但是我我在网上找不到任何解释的行为磕磕绊绊。

我现在关注的是在客户端执行的验证逻辑。

问题是,如标题中所述,当且仅当我在Validator中设置ControlToValidate属性并使用我正在验证的文本框的ID 时,验证才会立即触发当焦点离开文本框;它甚至在onblur事件之前开火,这对我来说是绝对有害的,因为我使用onblur事件来标准化时间格式(例如" 9:00" - >" 09:00&# 34;," 11.45" - >" 11:45")因此,验证逻辑可能会收到不正确的值。另一方面,如果ControlToValidate属性保持空白,则仅在提交/回发时触发ClientValidationFunction。

我发现的唯一相关答案是https://stackoverflow.com/a/8649697/450684,但对我而言根本没有任何意义。为什么ControlToValidate的存在表明我希望在onblur之前执行客户端验证?我不想要它!有没有办法来抑制这种行为?

以下是一个示例页面:

<asp:TextBox runat="server" AutoPostBack="false" ID="txtBox1" onblur="FormatText(this);" />
<asp:CustomValidator runat="server" ID="CV1" ControlToValidate="txtBox1" ClientValidationFunction="Test1" />
<asp:CustomValidator runat="server" ID="CV2" ClientValidationFunction="Test2" />
<asp:Button ID="btn1" Text="postback" runat="server" OnClick="btn1_Click" />
<asp:Label ID="lbl1" runat="server" />
<script type="text/javascript">
    function FormatText(txtBox1)
    {
        alert('FormatText');
    }
    function Test1(val, args)
    {
        alert('Test1');

    }
    function Test2(val, args)
    {
        alert('Test2');
    }</script>

我想要的是Test1和Test2只能在btn1的点击上执行;相反,在txtBox1的onblur事件中,我按此顺序执行Test1和FormatText

ASP.NET的客户端验证对我来说非常有趣,可以写作和研究,不要让它毁了一切: - )

THX

PS:.NET框架的版本是4.0。另外,服务器端语言是C#,如果重要的话

2 个答案:

答案 0 :(得分:1)

我认为这是怎么回事:

ASP.NET客户端验证的标准行为是验证退出字段的时间。这是一个观察,而不是对已发布标准的引用(尽管可能有一个。)开箱即用的验证器都是这样的。所有这些都需要指定要验证的特定字段。

自定义验证程序允许您验证单个控件(通过使用ControlToValidate指定它),或者允许您验证控件组合,在这种情况下,您将ControlToValidate设置为空字符串。除非事情发生变化,否则你必须指定它;如果省略该属性,则不会进行验证。

因此......如果您指定要进行验证的控件,则自定义验证器的行为与其他验证器相同,并对退出该字段的用户做出反应。如果您没有指定要进行验证的控件,则它不知道您感兴趣的控件,并且不会这样做。

您可以通过编写真正的自定义验证器来解决此问题:从BaseValidator继承。这实际上可以带来很多乐趣。

答案 1 :(得分:1)

如何管理控件的验证事件。 您可以从验证器中删除ControlToValidate属性,并根据需要为textbox事件上的文本框绑定验证。您也可以在验证之前或之后添加一些功能逻辑。按钮单击事件验证保持不变,无需更改。

function BindValidation(){$('#txtBox1').on('blur keyup change',function(){ValidatorValidate($('#CV1').get(0));});}
Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded(BindValidation);


//validation function  example for CV1 validator
function Test1(val, args)
{                  

    args.IsValid=$('#txtBox1').val().length>0&&$('#txtBox1').val().match(/^\s+$/g)==null;
}