【问题标题】:Date validation allows invalid dates日期验证允许无效日期
【发布时间】:2013-04-16 15:17:06
【问题描述】:

使用这个模型:

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>

【问题讨论】:

  • 既然我们在谈论 JavaScript,请显示 渲染的 HTML 输出以及任何 jQuery 代码。
  • @Sparky 这是开箱即用的验证,大部分内容都在jQuery.Validation,我会发布它,但我看不出这对任何人有什么帮助:)
  • @Sparky 查看我对输出的编辑
  • 如果您输入像 2013/04/16 这样的日期会发生什么?那样有用吗?似乎您遇到了 DateTime.Parse 或 DateTime.TryParse 是如何实现的问题。也许您需要在向其抛出 ValidationMessageFor 之前进行一些自己的自定义解析和/或验证。
  • 您发布的 html 完全符合预期。 jsfiddle。如果您在日期字段中输入2013/20/20,则会收到验证错误。但是data-val-weekdaydate 是什么?我在验证插件中的任何地方都没有看到,我正在查看 jQuery.Validate 和 jQuery.validate.unobtrusive 的最新源代码。那是自定义验证方法吗?你的来源在哪里?

标签: asp.net-mvc jquery-validate


【解决方案1】:

这似乎是 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},但我认为诀窍是强制执行 -

【讨论】:

  • 我希望我的日期是有效的英国日期。我在实现新的验证方法时遇到了同样的问题,因为它总是在 jQuery 中使用美国日期格式 - mm/DD/yyyy
  • 那么同样的概念也适用,但是在覆盖的日期方法中,您可以创建一个正则表达式d{2}/d{2}/d{4},然后执行字符串操作来解析出日、月和年。然后将其传递给Date(yyyy, mm, dd) 构造函数。如果他们输入了一个有效的日期,它就会过去。
【解决方案2】:

我使用moment.js 调整了date 验证方法jQuery.validation.js,现在看起来像这样:

date: function (value, element) {
  return this.optional(element) || moment(value, "DD-MM-YYYY").isValid();
},

【讨论】:

    【解决方案3】:

    http://jqueryvalidation.org/date-method “不应使用此方法,因为它依赖于新的 Date 构造函数,该构造函数在浏览器和语言环境中的行为非常不同。”

    当我使用 MVC 脚手架时,我添加 给 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;感谢卢克的调整!

    【讨论】:

      猜你喜欢
      • 2017-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-24
      • 2021-05-19
      • 2016-10-16
      • 1970-01-01
      相关资源
      最近更新 更多