【问题标题】:EditorTemplates, Expressions, and Nullable Types编辑器模板、表达式和可空类型
【发布时间】:2014-09-17 04:00:45
【问题描述】:

我正在创建一个 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 =&gt; Convert(m.StartDate),随后在传递到底层 EditorFor 调用时会引发错误。但是,如果我直接在页面中调用 EditorFor,则处理可为空的日期时间没有问题。

如果我创建相同的扩展方法,但其表达式返回 DateTime 而不是 DateTime?,一切正常。

什么是添加 Convert() 调用,如何防止它?

【问题讨论】:

  • 表达式是否必须表示日期时间?或日期时间明确?你能说 Expression> 吗?
  • 它仍然被包裹在 Convert() 中传递。

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


【解决方案1】:

你处理错了。编辑器模板本身非常灵活;不需要帮手。

我假设您最终想要实现的是“日期”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")

【讨论】:

  • 是的,我看到使用属性会有潜在的价值。尽管我们将视图模型和业务模型结合起来的方式阻碍了它们的好处。 (我们不想用视图逻辑来装饰业务模型,也不想在视图模型上重新创建现有的验证属性)。但我现在的问题实际上更多地是关于框架的机制:什么是将 Convert() 添加到表达式中
  • 我认为您缺少观点模型。视图模型应该保存您的验证。实体应该只具有数据库级别的东西,如字符串上的Required,以强制NOT NULL。
猜你喜欢
  • 2011-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-10
  • 1970-01-01
相关资源
最近更新 更多