1

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

基本上,对于我模型中的每个日期时间对象,我想将“日期选择器”类添加到该 html 元素中。这是为了 jQueryUI 的目的。

我究竟做错了什么?

4

3 回答 3

4

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

@model DateTime
@Html.TextBox("", Model, new { @class = "date-selector" }); 
THE EDITOR IS WORKING 
于 2011-08-21T23:29:28.640 回答
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)
于 2012-02-17T22:11:57.547 回答
0

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

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

因此,我扩展了@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');
});

希望这对将来有这种需求的人有所帮助。

于 2012-02-26T15:33:35.173 回答