我当前正在使用引导日期时间选择器来处理应用程序中的所有日期选择。我正在使用Jquery验证,它可与moment.js一起使用。
输入使用日期时间选择器的自定义敲除绑定。
<div class="col-xs-12 col-md-6">
<div class="form-group">
<label class="control-label col-md-4">Date and Time client received clinical*</label>
<div class="col-md-6" data-bind="visible: SubmittedToClientDateNA() === false">
<input id="SubmittedToClientDate" name="SubmittedToClientDate" autocomplete="off" type="text" class="ph-datetimepicker form-control" data-bind="dateAndTimePicker: SubmittedToClientDate" />
</div>
<div class="col-md-2">
<div class="checkbox">
<label>
<input id="SubmittedToClientDateNA" name="SubmittedToClientDateNA" type="checkbox" data-bind="click: SetSubmittedToClientDate, checked: SubmittedToClientDateNA">N/A
</label>
</div>
</div>
</div>
</div>
Moment.js保持日期格式,并且此js确保有一个值。
$("#editAuthorizationInformationForm").validate({
rules: {
SubmittedToClientDate: { required: true }
}
});
我遇到的问题是,当用户输入类似“ 12/20/0008”的日期时,验证会将其评估为有效日期。但是,当值返回到服务器并尝试将其保存到sql server时,它将引发错误:
“将datetime2数据类型转换为datetime数据类型会导致超出范围的值。”
有没有一种方法可以不仅验证日期格式,还可以验证客户端上的日期本身?
谢谢您的帮助!
已解决:
我通过添加以下自定义验证器方法解决了此问题:
$.validator.addMethod("ValidateDateFormat", function (date) {
var pattern = /(0\d{1}|1[0-2])\/([0-2]\d{1}|3[0-1])\/(19|20)(\d{2})/;
var m = date.match(pattern);
if (!m)
return false;
var d = new Date(date);
// Now let's ensure that the date is not out of index
if (d.getMonth() + 1 == parseInt(m[1], 10) && d.getDate() == parseInt(m[2], 10)) {
return true;
}
return false;
}, "Please enter a valid date");
并将其应用于输入字段:
$("#editAuthorizationInformationForm").validate({
rules: {
SubmittedToClientDate: { ValidateDateFormat: true, required: true }
}
});