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

これは、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 に答える