Я знаю, что это старый вопрос, но у меня была такая же неприятная проблема, и я не хотел создавать шаблон EditorTemplate, который применялся ко всем значениям DateTime (в моем пользовательском интерфейсе были моменты, когда я хотел отображать время, а не раскрывающийся календарь JQueryUI). В моем исследовании коренные проблемы, с которыми я столкнулся, были:
- Стандартный TextBoxFor помощник позволил мне применить пользовательский класс «выбора даты» для рендеринга ненавязчивого календаря JQueryUI, но TextBoxFor не будет форматировать DateTime без времени, поэтому вызовет рендеринг календаря. потерпеть неудачу.
- Стандартный EditorFor будет отображать DateTime в виде отформатированной строки (при оформлении с соответствующими атрибутами, такими как
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd/MM/yyyy}")]
, но он не позволит мне применить пользовательский класс «выбора даты») .
Поэтому я расширил ответ @ Ashraf и создал собственный класс HtmlHelper, который имеет следующие преимущества:
- Метод автоматически преобразует DateTime в ShortDateString, необходимый для календаря JQuery (JQuery завершится сбоем, если будет время).
- По умолчанию помощник применяет необходимые атрибуты htmlAttributes для отображения календаря JQuery, но при необходимости их можно переопределить.
- Если дата равна нулю, 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());
}
А для тех, кто хочет знать синтаксис JQuery, который ищет объекты с украшением класса date-picker
, чтобы затем отобразить календарь, вот он:
$(document).ready(function () {
$('.date-picker').datepicker({ inline: true, maxDate: 0, changeMonth: true, changeYear: true });
$('.date-picker').datepicker('option', 'showAnim', 'slideDown');
});
Надеюсь, это поможет кому-то в будущем, у кого есть такая потребность.