我正在创建一个HtmlHelper扩展,目的是获取DateTime(可能是也可能不可为空)并将其传递给编辑器模板,该模板允许分别编辑日期和时间。例如:
的HtmlHelper:
public static IHtmlString DateTimeFor_DateAndTime<TModel>(this HtmlHelper<TModel> htmlHelper,Expression<Func<TModel, DateTime?>> expression,string htmlFieldName = null,object additionalViewData = null)
{
return htmlHelper.EditorFor(expression,
"DateTime_DateAndTime",
htmlFieldName,
additionalViewData);
}
在视图中:
@Html.DateTimeFor_DateAndTime(m => m.StartDate)
问题是,当StartDate不是可以为空的日期时间时,传递给扩展名的表达式是m => Convert(m.StartDate)
,它会在传递给底层的EditorFor调用时抛出错误。但是,如果我直接在页面中调用EditorFor,那么处理可空的日期时间就没有问题了。
如果我创建相同的扩展方法,但其表达式返回DateTime而不是DateTime?,那么一切正常。
什么是添加Convert()调用,以及如何阻止它?
答案 0 :(得分:0)
你正在处理这个错误。编辑器模板本身非常灵活;没有帮助者。
我认为您最终要实现的目标是“日期”DateTime
与“日期时间”,甚至只是“时间”DateTime
对象的不同显示。 DataType
属性已经为您提供了必要的功能。只需用适当的一个装饰您的房产:
[DataType(DataType.DateTime)]
public DateTime DateTime { get; set; }
[DataType(DataType.Date)]
public DateTime Date { get; set; }
[DataType(DataType.Time)]
public DateTime Time { get; set; }
然后,您可以拥有单独的DateTime.cshtml
,Date.cshtml
和Time.cshtml
编辑器/显示模板,每个模板都针对您需要的特定格式/控件进行自定义。
使用编辑器/显示模板,如果传入常规DateTime
,您的模型可以是可为空的DateTime
而不会导致错误:
@model DateTime?
对于这一点你真的没有什么可以做的,所以我认为根本不需要助手。即使你想要一个专门的模板,例如MySpecialDateTime.cshtml
,您可以使用UIHint
装饰您的媒体资源:
[UIHint("MySpecialDateTime")]
public DateTime SpecialDateTime { get; set; }
或者,您可以将要使用的任何模板传递给Html.EditorFor
或Html.DisplayFor
:
@Html.EditorFor(m => m.SpecialDateTime, "MySpecialDateTime")