2011-11-30 171 views
0

我创建了一个简单的自定义验证,以使进入确认时间为12小时格式和文字输入有一个'99:99' 掩模组,因此我将获得:ASP.NET MVC自定义验证

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。假设我有一个被设置为必需的字段。当我第一次输入该表单时,该字段不会触发模糊验证。我可以输入废话,删除垃圾,但不会触发验证。这就是我困惑的原因。这似乎与默认行为有所不同。我会认为,在提交尝试尝试之后会触发验证,就像我提到的示例一样。

回答

1

问题1:

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

问题2:

通常验证onBlur过,在我的经验。

+0

JavaScript有'substr'虽然 – Esailija

+0

@Esailija他的代码正在使用'String。substring()',所以我只是解释为什么它不像他期望的那样工作。检查链接。 –

+0

嗯,我只是想把它放在那里,你可以建议他,而不是试图找出什么末尾索引必须在'substring' – Esailija

0

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

2.)验证关键点和模糊检查;你可以设置这两个的作为选项params对象

onkeyup: false, 
onblur: false 
0

为什么不直接使用正则表达式验证,然后让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=":" /> 
+2

这是MVC;这些控件不适用 –