ASP.NET MVC自定义验证

时间:2011-11-30 14:15:32

标签: jquery asp.net-mvc

我创建了一个简单的自定义验证,以确保输入的时间是12小时格式,文本输入的掩码设置为'99:99',所以我会得到:

12:00

验证在服务器上运行良好:

     private ValidationResult ValidateTwelveHourFormat(string time, ValidationContext validationContext)
    {
        if (String.IsNullOrWhiteSpace(time.Substring(0, 1))
            || Convert.ToInt32(time.Substring(0, 1)) > 1
            || Convert.ToInt32(time.Substring(1, 1)) > 2
            || Convert.ToInt32(time.Substring(3, 1)) > 5)
        {
            return new ValidationResult(FormatErrorMessage(validationContext.DisplayName));
        }
        return ValidationResult.Success;
    }

然而,客户端上的相同验证并不像我期望的那样:

$.validator.unobtrusive.adapters.addSingleVal('timeformat', 'format');
$.validator.addMethod('timeformat', function (value, element, timeformat) {
if (value) {
    if (timeformat == "TwelveHour") {
        if (value.toString().substring(0, 1) == ""
                || value.toString().substring(0, 1) > 1
                || value.toString().substring(1, 1) > 2
                || value.toString().substring(3, 1) > 5) {
            return false;
        }
    }
}
return true;
});

客户端将仅正确验证第一个数字。因此,如果我输入3,它将触发正常,但不会对字符串中的任何其他位置。我在那里扔了一些警告,当我在文本中输入一个字符时,它似乎触发了该方法。这种行为使我感到困惑,因为我认为这不会在表单首次提交之前触发,只有在之后才会触发。否则,用户在第一次进入表单时会看到错误消息,我不相信验证方式通常有效。

1。)为什么客户端没有正确验证其他字符位置?
2.)为什么客户在表单尚未提交时进行验证?

更新

1。)我使用了JavaScript的substr(),因为它的行为类似于C#的String.Substring()。

对于问题2 - 我正在使用mvc框架的Data Annoations。假设我有一个字段设置为必需。当我第一次进入该表单时,该字段不会触发模糊验证。我可以输入垃圾,删除垃圾,但不能触发验证。这就是为什么我很困惑。它似乎与默认行为不同。我认为在尝试提交尝试之后会触发验证,就像我提到的例子一样。

3 个答案:

答案 0 :(得分:1)

问题1:

Javascript String.substring()的工作方式与C#不同。第二个参数不是长度,而是结束索引。 http://www.w3schools.com/jsref/jsref_substring.asp

问题2:

根据我的经验,它通常也会验证onBlur

答案 1 :(得分:0)

1。)我的第一个答案是错的;我需要再看一遍。

2。)验证关键字和模糊的检查;您可以将这两者设置为选项对象中的参数

onkeyup: false,
onblur: false

答案 2 :(得分:0)

为什么不使用Regular Expression Validator然后让IT担心客户端代码。你可以使用这样的东西:

<asp:RegularExpressionValidator ID="revTime" ControlToValidate="txtTime" ValidationExpression="[0]{0,1}[1-9]:[0-5][0-9]|[1][0-2]:[0-5][0-9]" ValidationGroup="x" runat="server" ErrorMessage="Not a valid time." />

如果你正在使用AjaxControlToolkit,你可以使用他们的FitleredTextBoxExtender过滤编辑,如下所示:

<ajaxToolkit:FilteredTextBoxExtender ID="fteTime" runat="server" TargetControlID="txtTime" FilterMode="ValidChars" FilterType="Numbers, Custom" ValidChars=":" />