jquery验证允许“data-val-date”/ MVC的数字

时间:2018-05-11 18:57:25

标签: jquery asp.net-mvc validation bootstrap-4

我已启用客户端验证,jquery.validate.jsjquery.unobtrusive.ajax.js都在我的网页上引用。我正在使用@Html.TextBoxFor()在表单中创建输入。

除日期外,客户端验证工作正常。

如果我尝试输入一封信,我会收到客户端错误,这很好。

如果我输入一个明显无效的日期,例如02/77/2018,我会像预期/期望一样得到客户端错误,就像任何其他没有通过验证的类型一样。

但是,如果我只为日期输入一个整数(例如111),它会通过验证。有谁知道为什么?

幸运的是,它没有在控制器中通过我的服务器端验证,但我所有的其他验证都是在客户端完成的,我希望保持一致。我可以编写一些自定义代码来验证日期的格式,但似乎必须有一种更简单的方法来确保输入为MM/dd/yyyyMM-dd-yyyy格式。

要重现此问题,请参阅this DotNetFiddle

  1. 在文本框中输入A并选项卡 - 显示错误消息
  2. 在文本框中输入111并跳出标签 - 错误消息消失
  3. 在文本框中输入11112018并跳出标签 - 再次显示错误消息
  4. 再次输入111,错误消息消失
  5. 单击“保存” - 提交表单并显示服务器端错误消息

2 个答案:

答案 0 :(得分:2)

jquery.validate.js插件通过调用new Date(value);

来验证日期

实际功能是

// http://docs.jquery.com/Plugins/Validation/Methods/date
date: function( value, element ) {
    return this.optional(element) || !/Invalid|NaN/.test(new Date(value).toString());
},

是否返回true还取决于您使用的浏览器。

例如,在Chrome中

new Date('aaa') // returns Invalid Date
new Date('111') // return Thu Jan 01 0111 00:00:00 GMT+1030 (Cen. Australia Daylight Time)
new Date('11112018') // returns Invalid Date
FireFox / Edge中的

new Date('aaa') // returns Invalid Date
new Date('111') // returns Invalid Date
new Date('11112018') // returns Invalid Date

更令人困惑的是,如果您要在Chrome中输入new Date('02/77/2018'),则会获得Invalid Date,但在FireFox和Edge中,它会返回一个日期(但不是您输入的日期)

作为附注,我在GitHub上提出了this issue,但它被拒绝了。请注意,有关date的评论将被弃用,而不是dateISO,但尚未合并到jquery.validate.unobtrusive.js

This answer包含一个脚本,您可以使用该脚本为所有浏览器提供正确的客户端验证。

答案 1 :(得分:-1)

您可以使用正则表达式检查正则表达式的输入 这只是一个简单的正则表达式,但如果你愿意,你可以构建一个复杂的正则表达式 天空是极限

public class SampleViewModel
{
    [RegularExpression(@"^.*\d{1,2}\/\d{1,2}\/\d{4}$", ErrorMessage = "Only mm/dd/yyyy is allowed!")]
    public DateTime Date { get; set; }

}