これは古い質問であることは知っていますが、同じイライラする問題があり、すべての DateTime 値に適用される EditorTemplate を作成したくありませんでした (JQueryUI ドロップではなく時間を表示したい UI がありました-ダウンカレンダー)。私の調査では、私が遭遇した根本的な問題は次のとおりです。
- 標準のTextBoxForヘルパーを使用すると、"date-picker" のカスタム クラスを適用して目立たない JQueryUI カレンダーをレンダリングできますが、TextBoxFor は時刻なしで DateTime をフォーマットしないため、カレンダーのレンダリングが失敗します。
- 標準のEditorForは、DateTime を書式設定された文字列として表示します ( などの適切な属性で装飾されている
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd/MM/yyyy}")]
場合、カスタムの「日付ピッカー」クラスを適用することはできません。
したがって、@ Ashraf の回答を拡張し、次の利点を持つカスタム HtmlHelper クラスを作成しました。
- このメソッドは、DateTime を、JQuery カレンダーが必要とする ShortDateString に自動的に変換します (時間が存在する場合、JQuery は失敗します)。
- デフォルトでは、ヘルパーは必要な htmlAttributes を適用して JQuery カレンダーを表示しますが、必要に応じてオーバーライドできます。
- 日付が null の場合、MVC は 1/1/0001 の日付を値として設定します。このメソッドはそれを空の文字列に置き換えます。
ある時点で他の誰かに役立つことを期待して、これをここに投稿します。必要な変更に関する提案は大歓迎です。
public static MvcHtmlString CalenderTextBoxFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, object htmlAttributes = null)
{
var mvcHtmlString = System.Web.Mvc.Html.InputExtensions.TextBoxFor(htmlHelper, expression, htmlAttributes ?? new { @class = "text-box single-line date-picker" });
var xDoc = XDocument.Parse(mvcHtmlString.ToHtmlString());
var xElement = xDoc.Element("input");
if (xElement != null)
{
var valueAttribute = xElement.Attribute("value");
if (valueAttribute != null)
{
valueAttribute.Value = DateTime.Parse(valueAttribute.Value).ToShortDateString();
if (valueAttribute.Value == "1/1/0001")
valueAttribute.Value = string.Empty;
}
}
return new MvcHtmlString(xDoc.ToString());
}
date-picker
また、クラス装飾を使用してオブジェクトを検索し、カレンダーをレンダリングする JQuery 構文を知りたい場合は、次のとおりです。
$(document).ready(function () {
$('.date-picker').datepicker({ inline: true, maxDate: 0, changeMonth: true, changeYear: true });
$('.date-picker').datepicker('option', 'showAnim', 'slideDown');
});
うまくいけば、これは将来、このニーズを持つ誰かを助けるでしょう.