2

我正在构建一个 CustomValidator 来处理我自己的应用程序在时间字段(“09:00”、“15:35”、...)上的逻辑,但我偶然发现了一种我在网上找不到任何解释的行为。

我现在的重点是在客户端执行的验证逻辑。

问题是,正如标题中所说,当且仅当我在 Validator 中使用我正在验证的文本框的 ID 设置 ControlToValidate 属性时,一旦焦点离开文本框,验证就会被触发;它甚至在 onblur 事件之前触发,这对我来说绝对是有害的,因为我正在使用 onblur 事件来标准化时间格式(例如“9:00”->“09:00”、“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 的客户端验证对我来说写和学习真的很有趣,不要让它毁了一切 :-)

谢谢

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

4

2 回答 2

2

我认为发生了什么是这样的:

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

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

所以......如果您指定一个要验证的控件,自定义验证器的行为就像所有其他验证器一样,并对退出该字段的用户做出反应。如果您不指定要验证的控件,则它不知道您对哪些控件感兴趣,并且不会这样做。

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

于 2012-11-30T23:01:21.100 回答
1

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

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;
}
于 2012-12-01T11:39:41.300 回答