我知道这是一个较老的问题,但我遇到了同样令人沮丧的问题,我不想创建一个适用于所有 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');
});
希望这对将来有这种需求的人有所帮助。