日期验证允许无效日期

时间:2013-04-16 15:17:06

标签: asp.net-mvc jquery-validate

使用此模型:

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>

3 个答案:

答案 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))));   
}

jsfiddle

基本上,我只是添加了一个简单的正则表达式,以确保输入的值是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;谢谢你的调整卢克!