我创建了一个简单的自定义验证,以确保输入的时间是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。假设我有一个字段设置为必需。当我第一次进入该表单时,该字段不会触发模糊验证。我可以输入垃圾,删除垃圾,但不能触发验证。这就是为什么我很困惑。它似乎与默认行为不同。我认为在尝试提交尝试之后会触发验证,就像我提到的例子一样。
答案 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=":" />