使用此模型:
public class Holiday
{
[Required]
public DateTime From { get; set; }
}
有了这个观点:
@model Holiday
@using System.Web.Optimization
@{
ViewBag.Title = "Request";
}
@using (Html.BeginForm())
{
@Html.ValidationSummary(true)
<fieldset>
<legend>Holiday Request</legend>
<div class="editor-label">
@Html.LabelFor(model => model.From)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.From)
@Html.ValidationMessageFor(model => model.From)
</div>
<p>
<input type="submit" value="Create" />
</p>
</fieldset>
}
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}
如果我输入文字,我的日期无效。如果我把场留空,我也会收到一条消息。但是,如果我输入2013/20/20
之类的日期这是有效的,我该如何更改?我认为它可能与文化有关,但这在所有文化中都是无效的。
来源HTML
<form action="/" method="post">
<fieldset>
<legend>Holiday Request</legend>
<div class="editor-label">
<label for="From">From</label>
</div>
<div class="editor-field">
<input class="text-box single-line" data-val="true" data-val-date="The field From must be a date." data-val-required="The From field is required." data-val-weekdaydate="Must be a working day" id="From" name="From" type="datetime" value="" />
<span class="field-validation-valid" data-valmsg-for="From" data-valmsg-replace="true"></span>
</div>
<p>
<input type="submit" value="Create" />
</p>
</fieldset>
</form>
<script src="/Scripts/jquery.unobtrusive-ajax.js"></script>
<script src="/Scripts/jquery.validate.js"></script>
<script src="/Scripts/jquery.validate.unobtrusive.js"></script>
</body>
</html>
答案 0 :(得分:0)
这似乎可能是某些问题(提示:功能)在Firefox和可能的IE中(我目前正在运行20.0.1和IE8)。 jQuery验证的相关代码是:
date: function(value, element) {
return this.optional(element) || !/Invalid|NaN/.test(new Date(value));
}
使用new Date()
检查日期的有效性。
如果我将new Date("2020/20/20")
放入控制台,则会返回有效日期Date {Fri Aug 20 2021 00:00:00 GMT-0500 (Central Daylight Time)}
。换句话说,它从20到8(20-12 = 8 ... 8月)“滚动”了几个月。
但是如果我使用 - 而不是 / 输入日期为new Date("2020-20-20")
,则日期解析工作正常,我得到Date {Invalid Date}
。如果您可以在日期字段上强制执行严格的yyyy-MM-dd格式,那么修复此操作非常简单。只需覆盖日期函数,如下所示:
$.validator.methods.date = function (value, element) {
return this.optional(element) ||
(/^(\d{4}-\d{2}-\d{2})$/.test(value) &&
!(/Invalid|NaN/.test(new Date(value))));
}
基本上,我只是添加了一个简单的正则表达式,以确保输入的值是dddd-dd-dd格式(带有 - 字符)。如果通过,结果将传递给浏览器以进行日期验证。这不是一个很好的解决方案,但我认为强制执行日期格式并不一定是坏事,因为它可以提高一致性。您可以根据需要更改正则表达式,例如\d{4}-\d{1,2}-\d{1,2}
,但我认为诀窍是强制执行 - 。
答案 1 :(得分:0)
我使用moment.js
来调整date
验证方法jQuery.validation.js
,它现在看起来像这样:
date: function (value, element) {
return this.optional(element) || moment(value, "DD-MM-YYYY").isValid();
},
答案 2 :(得分:0)
http://jqueryvalidation.org/date-method “不应该使用此方法,因为它依赖于新的Date构造函数,它在浏览器和语言环境中的行为方式非常不同。”
当我使用MVC Scaffolding时,我添加了 到POCO以及:
[DisplayFormat(ApplyFormatInEditMode=true, DataFormatString = "{0:dd-MMM-yyyy}")]
if (!Modernizr.inputtypes.datetime) {
$("input[type='datetime']").datepicker({ dateFormat: "dd-M-yy" });
}
上面的jQuery页面有一个示例,显示Luke和我的日期品味不适用于jquery.validate.js;谢谢你的调整卢克!