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

Posted

技术标签:

【中文标题】jquery 验证允许“data-val-date”/MVC 的数字【英文标题】:jquery validation allows numbers for "data-val-date"/MVC 【发布时间】:2018-10-22 05:50:51 【问题描述】:

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

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

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

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

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

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

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

    在文本框中输入 A 并跳出 - 显示错误消息 在文本框中输入 111 并跳出 - 错误消息消失 在文本框中输入 11112018 并跳出 - 错误消息再次出现 再次输入111,错误信息消失 点击保存——表单提交并显示服务器端错误信息

【问题讨论】:

什么鬼? “111”通过验证,但“11112018”没有。 【参考方案1】:

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 包含一个脚本,您可以使用该脚本对所有浏览器进行正确的客户端验证。

【讨论】:

【参考方案2】:

您可以使用正则表达式对照您的正则表达式检查输入。 这只是一个简单的正则表达式,但您可以根据需要构建一个复杂的正则表达式! 天空才是极限

public class SampleViewModel

    [RegularExpression(@"^.*\d1,2\/\d1,2\/\d4$", ErrorMessage = "Only mm/dd/yyyy is allowed!")]
    public DateTime Date  get; set; 


【讨论】:

这与问题无关。并且该属性是DateTime,因此不需要[Required](默认情况下需要它)并且[DataType(DataType.DateTime)]与验证无关 [DataType] 用于添加 type="..." 属性,并且仅在使用 EditorFor() 方法时才受到尊重 - 而 OP 甚至没有使用它。同样,它与客户端验证无关 那你为什么添加了一个与问题无关的答案? 改变了我的答案,让 OP 完全符合他的要求。

以上是关于jquery 验证允许“data-val-date”/MVC 的数字的主要内容,如果未能解决你的问题,请参考以下文章

jquery validate插件如何允许为空?

jQuery US Currency 验证正则表达式也允许整数

使用验证插件 jquery 验证输入数组 - 显示每个输入的错误

在 Jquery Validation 中最多允许 10 封电子邮件,每个逗号分隔

Jquery表单验证-电话号码

jquery rules 输入验证 想加入对输入框内容的合法性验证