web-dev-qa-db-ja.com

MVC 4クライアント検証で米国以外の日付を検証する方法は?

日時フィールドのクライアント側の検証で問題が発生する状況があります。送信しようとすると、日付が無効であると表示され続けます(2013年7月27日)。しかし、日付を米国形式に変換すると機能します(2013年7月27日)。

私のビューモデルは次のとおりです。

[DataType(DataType.Date), DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)]
public DateTime? AuditDate { get; set; }

Index.html

 @Html.TextBoxFor(m => m.AuditDate)

Web.configを更新しました

<globalization culture="en-AU" uiCulture="en-AU" />

私は何を逃しましたか?

ありがとう

12
user2206329

他の誰かが私のためにこれを分類しました、それはすべてクライアント側のJquery検証と関係がありました。もう一度ありがとうasymptoticFault ..あなたはロック.. MVC 4日付文化の問題?

これが私が使用したそのリンクからの情報です...

問題は、日付を解析するときに文化を考慮しないjQuery検証です。クライアント側の検証をオフにすると、カルチャを認識しているサーバーで日付が適切に解析されます。

修正は、日付のjQuery検証をオーバーライドし、追加のjQueryグローバリゼーションプラグインを含めることです。グローバル化プラグインを見つけることができます ここ 。 Nuget PackageManagerを使用してプラグインを簡単にダウンロードすることもできます。パッケージマネージャーを開いて、左側の[オンライン]タブを選択し、検索に「グローバル化」と入力したところ、これが最初の結果でした。インストールしたら、次の2つのファイルを含めました。

globalize.js 
globalize.culture.en-AU.js

スクリプトタグを使用して直接含めるか、他のjQuery検証ファイルと一緒にバンドルに配置することができます。

それらを取得したら、次のスクリプトを追加して、日付のjQuery検証をオーバーライドする必要があります。

<script type="text/javascript">
    $(function () {
        $.validator.methods.date = function (value, element) {
            Globalize.culture("en-AU");
            // you can alternatively pass the culture to parseDate instead of
            // setting the culture above, like so:
            // parseDate(value, null, "en-AU")
            return this.optional(element) || Globalize.parseDate(value) !== null;
        }
    });
</script>
27
user2206329

クライアント検証の問題は、jquery.validate.unobtrusive.min.jsのMVCバグ(MVC 5でも)が原因で発生する可能性がありますが、発生しません)日付/日時形式を任意の方法で受け入れます。残念ながら、手動で解決する必要があります。

私の最終的に機能するソリューション:

前に含める必要があります:

@Scripts.Render("~/Scripts/jquery-3.1.1.js")
@Scripts.Render("~/Scripts/jquery.validate.min.js")
@Scripts.Render("~/Scripts/jquery.validate.unobtrusive.min.js")
@Scripts.Render("~/Scripts/moment.js")

次を使用してmoment.jsをインストールできます。

Install-Package Moment.js

そして、最終的に日付形式パーサーの修正を追加できます。

$(function () {
    $.validator.methods.date = function (value, element) {
        return this.optional(element) || moment(value, "DD.MM.YYYY", true).isValid();
    }
});
9
lukyer

日付にjQuery検証を使用すると、Chromeを使用した日付ではうまく機能しないことがわかります。これは、米国以外のロケールを使用する場合に発生します。

解決策は ChromeのjQuery非米国日付検証の修正 で提示されました

4
Abbas Amiri