EditorTemplates,Expressions和Nullable Types

时间:2014-09-16 18:53:31

标签: asp.net-mvc mvc-editor-templates

我正在创建一个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()调用,以及如何阻止它?

1 个答案:

答案 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.cshtmlDate.cshtmlTime.cshtml编辑器/显示模板,每个模板都针对您需要的特定格式/控件进行自定义。

使用编辑器/显示模板,如果传入常规DateTime,您的模型可以是可为空的DateTime而不会导致错误:

@model DateTime?

对于这一点你真的没有什么可以做的,所以我认为根本不需要助手。即使你想要一个专门的模板,例如MySpecialDateTime.cshtml,您可以使用UIHint装饰您的媒体资源:

[UIHint("MySpecialDateTime")]
public DateTime SpecialDateTime { get; set; }

或者,您可以将要使用的任何模板传递给Html.EditorForHtml.DisplayFor

@Html.EditorFor(m => m.SpecialDateTime, "MySpecialDateTime")