我已启用客户端验证,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
,错误消息消失答案 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; }
}