私はKendo DatePickerを使用して、ASP.NET MVC 4プロジェクトのKendo Gridに表示されている日付フィールドを編集しています。 DatePickerを日付フィールドに使用してカスタム日付形式の文字列を使用するために、EditorTemplates
フォルダーの下の_Date.cshtml
_ファイルを次のように更新しました。
_@(Html.Kendo().DatePickerFor(m => m).Format("dd/MM/yyyy"))
_
そうすることで、DatePickerに希望どおりの形式を表示させることができました。ただし、手動のキー入力またはポップアップカレンダーからの選択により、入力用に入力された一部の日付の検証に失敗しました。
さらに調査すると、DatePickerは_M/d/Y
_形式に基づいて日付を検証していると言えます。その仮定は、2012年1月1日は有効な日付であるのに対し、2012年1月13日は有効ではないという私の発見に基づいて行われました。
_Date.cshtml
_のDatePicker宣言の最後に.ParseFormat("dd/MM/yyyy")
を追加してみましたが、何も修正されていません。したがって、これは間違いなくバグであり、後でTelerikに報告します。
しかし、当分の間、私はこれを機能させるための回避策を探しています。 JavaScriptで_kendo.ui.validator.rules.mvcdate
_をオーバーライドして、独自の検証関数を設定できることがわかりました。これはChromeでは正常に機能しますが、IE9では機能しません。
それで、DatePickerが_dd/MM/yyyy
_入力形式を受け入れるようにする方法はありますか?前もって感謝します。
内部的には、ASP.NET MVCの日付検証ルール(控えめなクライアント検証)は kendo.parseDate(string) メソッドを使用し、内部では 事前定義された日付パターン を使用しますフォーマットが定義されていません。 「dd/MM/yyyy」形式の日付は無効と見なされるため、デフォルトのカルチャは「en-US」であり、検証が失敗するのはそのためだと思います。可能な解決策の1つは、日付検証ルールをオーバーライドして(以前と同様)、特定の形式を使用して文字列を解析することです。もう1つのオプションは、ページのdiffカルチャ設定を設定することです。 たとえば、「de-DE」カルチャの短い日付形式は「dd/MM/yyyy」です。
私はこの方法を使用しており、問題なく機能しています。
これらの2行をページに追加します。
<script src="@Url.Content("~/Scripts/jquery.validate.js")"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")"></script>
次に、jQuery日付検証メソッドをオーバーライドします。
<script>
$(document).ready(function () {
kendo.culture("en-MY"); //your culture
$.validator.addMethod('date',
function (value, element) {
return this.optional(element) || kendo.parseDate(value)
});
});
</script>
その間私のWeb.config
私はこれを持っています...
<system.web>
<globalization uiCulture="en-MY" culture="en-MY"></globalization>
</system.web>
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)]
[Required(ErrorMessage = "Pick a date from Kendo Date Picker")]
public DateTime mydate{ get; set; }
@(Html.Kendo().DatePickerFor(m=>m.mydate)
.Name("MyDate")
.Format("dd/MM/yyyy")
.ParseFormats(new string[] {"dd/MM/yyyy"}))
/ スクリプトdocument.ready関数を追加 /
$(document).ready(function () { kendo.culture("en-GB");
$.validator.methods['date'] = function (value, element) {
var check = false;
var re = /^\d{1,2}\/\d{1,2}\/\d{4}$/;
if (re.test(value)) {
var adata = value.split('/');
var dd = parseInt(adata[0], 10);
var mm = parseInt(adata[1], 10);
var yyyy = parseInt(adata[2], 10);
var xdata = new Date(yyyy, (mm - 1), dd);
if ((xdata.getFullYear() == yyyy) && (xdata.getMonth() == (mm - 1)) &&
(xdata.getDate() == dd)) {
check = true;
}
else {
alert(value);
check = false;
}
} else
check = false;
return this.optional(element) || check;
}
});
日付検証ルールを変更しました:
$.validator.methods.date = function (value, element) {
return this.optional(element) || /^\d\d?-\w\w\w-\d\d\d\d/.test(value);
};
私のフォーマットはあなたのフォーマットと少し異なりますが、これを変更できるはずです。
簡単な答えは、カスタムの日付形式を使用しないことです。常に明示的に.Format( "MM/dd/yyyy")を明示的に実行し、 "dd/MM/yyyy"を使用しないでください( "yyyy-MM-dd"または "MMM d、yyyy"でもかまいません)。また、コントロールパネルまたはWeb.configで米国の地域設定を使用するようにWebサーバーを設定します。
次に、問題の説明と、実際にdd/MM/yyyyを機能させる方法について説明します。
剣道の日付検証では、デフォルトの剣道文化の日付形式であるkendo.culture()。calendar.patterns.d(および時間の場合は.t)を使用します。これを直接設定するか、別のカルチャを適用すると、検証される日付形式が設定されます。これはkendo.parseDateを使用するため、「MMM d、yyyy」のようなものは問題ありませんが、「dd/MM/yyyy」のようなものは、d> 12でデフォルトの米国の文化が使用されている場合、検証に失敗します(方法については、剣道のグローバリゼーションデモを参照してください。文化を切り替える)。
これが発生する理由は、DatePicker.Format(...)がわずかに壊れているためです。これはkendo.aspnetmvc.jsのバグであり、DatePicker形式を無視し、現在のカルチャ日付形式を使用してparseDateを実行するだけの代替の日付検証関数を提供します。これは修正されたjavascriptです。
date: function(input) {
var dp = input.data("kendoDatePicker") || input.data("kendoDateTimePicker");
if (dp != undefined) {
return input.val() === "" || kendo.parseDate(input.val(), dp.options.format) !== null;
}
return input.val() === "" || kendo.parseDate(input.val()) !== null;
},
また、kendo.validator.js/kendo.web.jsの日付バリデーター関数にはマイナーなバグがあり、Internet Explorerのグリッドでの日付検証が常に失敗します。
また、Webサーバーのグローバリゼーションが剣道の文化(Web.configまたはWindowsの地域のコントロールパネル)に一致するようにUSに設定されていることを確認してください。 FirefoxはMM/dd/yyyyを投稿し、Webサーバーはそれと一致する必要があります。また、DatePicker.Formatを明示的に指定しない場合、Webサーバーの地域の日付形式がすべてのクライアントブラウザーに適用されます。したがって、WebサーバーのWindowsのコントロールパネルでカナダ/イギリスの日付形式が設定されている場合、剣道グリッドのDatePickersはデフォルトでdd/MM/yyyyになり、検証時にエラーが発生し、FirefoxがWebサーバーに投稿すると(Firefoxの投稿でのKendoのデフォルトのカルチャ) MM/dd/yyyyなので、Webサーバーがdd/MM/yyyyを予期している場合、mvc日付バインディングは失敗します。
注:mvc以外の日付バリデーターを使用する場合:data-val-date属性を削除します。追加:data-type =\"date \" data-format =\"dd/MM/yyyy h:mm:ss tt \"。これはhtmlヘルパーでは不可能だと思います。 htmlとjavascriptを直接指定する必要があります。
注:「data-val-date」属性がないため、グリッド以外のDatePickerには検証がないようです。
また、「KendoUIは最初に日付の解析にparseFormatsオプションを使用し、次にそれをフォーマットオプションに変換して、最後に検証を実行することを思い出してください。これが検証でyyyy-MM-ddを使用し、["MM/dd/yyyy"ではありません」、 " dd/MM/yyyy "]。" - 日付を検証する方法は、剣道検証ツールを使用してyyyy-MM-ddの形式になっていますか?
Web.configのグローバリゼーション行:
<globalization requestEncoding="utf-8" responseEncoding="utf-8" culture="en-US" uiCulture="en-US" />