Проблема с этим простым EditorTemplate для объектов DateTime - PullRequest
1 голос
/ 21 августа 2011

Я бы хотел настроить шаблон EditorFor для каждого объекта времени данных в любой из моих моделей.

Я получаю эту ошибку:

\ EditorTemplates \ DateTime.cshtml (1): ошибка CS1973: «System.Web.Mvc.HtmlHelper» не имеет подходящего метода с именем TextBox, но, похоже, имеет метод расширения с таким именем. Методы расширения не могут быть динамически отправлены. Рассмотрим кастинг динамические аргументы или вызов метода расширения без Синтаксис метода расширения.

Вот весь код, который находится внутри EditorTemplate и называется DateTime.cshtml в папке EditorTemplates.

Есть идеи?

Вот что я называю в моем представлении:

<div class="editor-label">
    @Html.LabelFor(model => model.DateOfBirth)
</div>
<div class="editor-field">
    @Html.EditorFor(model => model.DateOfBirth)
    @Html.ValidationMessageFor(model => model.DateOfBirth)
</div>

И это пользовательский шаблон EditorTemplate, который я сделал:

@Html.TextBox("", Model, new { @class = "date-selector" });

THE EDITOR IS WORKING

По сути, для каждого объекта datetime в моих моделях я хочу добавить класс «date-selector» в этот элемент html. Это для целей jQueryUI.

Что я делаю не так?

Ответы [ 3 ]

4 голосов
/ 18 февраля 2012

Вы можете создать метод расширения, как показано ниже:

 public static MvcHtmlString CalenderTextBoxFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression)
    {
        return htmlHelper.TextBoxFor(expression, "{0:M/dd/yyyy}", new { @class = "datepicker text" });
    }

Затем используйте в поле зрения, как показано ниже:

@Html.CalenderTextBoxFor(model => model.Employee.HireDate)
4 голосов
/ 22 августа 2011

Вам необходимо определить тип модели редактора шаблонов.Добавьте «@model DateTime» в начало файла cshtml:

@model DateTime
@Html.TextBox("", Model, new { @class = "date-selector" }); 
THE EDITOR IS WORKING 
0 голосов
/ 26 февраля 2012

Я знаю, что это старый вопрос, но у меня была такая же неприятная проблема, и я не хотел создавать шаблон 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');
});

Надеюсь, это поможет кому-то в будущем, у кого есть такая потребность.

...