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.js
和 jquery.unobtrusive.ajax.js
。我正在使用@html.TextBoxFor()
在表单中创建输入。
客户端验证工作正常,日期除外。
如果我尝试输入字母,我会收到客户端错误,这很好。
如果我输入一个明显无效的日期,例如 02/77/2018
,我会收到预期/期望的客户端错误,就像任何其他未通过验证的类型一样。
但是,如果我只输入一个整数作为日期(例如111
),它就会通过验证。有谁知道为什么?
幸运的是,它没有通过控制器中的服务器端验证,但我所有其他验证都是在客户端完成的,我希望保持一致。我可以编写一些自定义代码来验证日期的格式,但似乎必须有一种更简单的方法来确保输入是MM/dd/yyyy
或MM-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 US Currency 验证正则表达式也允许整数
使用验证插件 jquery 验证输入数组 - 显示每个输入的错误