这个简单的EditorTemplate for DateTime对象有问题

时间:2011-08-21 19:29:29

标签: asp.net-mvc-3 editortemplates

我想为我的任何模型中的每个数据时对象配置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 个答案:

答案 0 :(得分:4)

您需要定义editortemplate的模型类型。将“@model DateTime”添加到cshtml文件的顶部:

@model DateTime
@Html.TextBox("", Model, new { @class = "date-selector" }); 
THE EDITOR IS WORKING 

答案 1 :(得分:4)

您可以创建扩展方法,如下所示:

 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)

答案 2 :(得分:0)

我知道这是一个较老的问题,但我有同样令人沮丧的问题,我不想创建一个适用于所有DateTime值的EditorTemplate(我的UI中有时候我想要显示时间而不是一个JQueryUI下拉日历)。在我的研究中,我遇到的根本问题是:

  • 标准的 TextBoxFor 帮助器允许我应用自定义类“日期选择器”来渲染不显眼的JQueryUI日历,但TextBoxFor不会在没有时间的情况下格式化DateTime,因此会导致日历渲染失败。
  • 标准 EditorFor 会将DateTime显示为格式化字符串(使用[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd/MM/yyyy}")]等适当属性修饰时,但不允许我应用自定义“日期 - 选择器“class。

因此,我扩展了@Ashraf的答案并创建了具有以下优点的自定义HtmlHelper类:

  • 该方法自动将DateTime转换为JQuery日历所需的ShortDateString(如果时间存在,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());
}

对于那些想要了解查找具有date-picker类装饰的对象的JQuery语法然后呈现日历的人,这里是:

$(document).ready(function () {
  $('.date-picker').datepicker({ inline: true, maxDate: 0, changeMonth: true, changeYear: true });
  $('.date-picker').datepicker('option', 'showAnim', 'slideDown');
});

希望这可以帮助将来有这种需求的人。