3

使用这个模型:

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>
4

3 回答 3

0

我曾经moment.js调整过date验证方法jQuery.validation.js,现在看起来像这样:

date: function (value, element) {
  return this.optional(element) || moment(value, "DD-MM-YYYY").isValid();
},
于 2013-04-17T10:59:20.877 回答
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},但我认为诀窍是强制执行-.

于 2013-04-16T18:58:27.180 回答
0

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;感谢卢克的调整!

于 2013-08-29T12:34:10.530 回答