如何在@ Html,DisplayFor()中使用人性化

时间:2018-10-25 11:58:55

标签: asp.net asp.net-mvc .net-core asp.net-core-mvc

如何在DisplayFor中人性化显示日期?

我这样尝试过:@Html.DisplayFor(model =>model.EndDate.Humanize())

但是编辑器显示如下错误:

  

表达式树可能不包含使用以下内容的调用或调用   可选参数

1 个答案:

答案 0 :(得分:1)

Html.DisplayFor是模板化的帮助程序,仅表示它使用模板返回模型表达式的值。默认模板只是在模型表达式引用的属性上调用ToString()。这样,您传递给它的内容必须是引用特定属性的模型表达式。您不能在其上执行类似致电Humanize的操作。

但是,您可以定义自己的模板。这需要在Views\Shared\DisplayTemplates中创建一个符合以下命名约定之一的视图:

  1. 以应使用的类型命名,例如DateTime.cshtml将应用于类型为DateTime的任何属性。

  2. DataType枚举的成员之一命名,在这种情况下,当将DataType应用于特定属性(例如应用属性Date.cshtml时将使用[DataType(DataType.Date)]

  3. 您可以随意命名,但是可以使用UIHint属性为该属性明确指定该名称,例如如果您应用[UIHint("MyAwesomeDateTime")]之类的属性,并且将使用关联的MyAwesomeDateTime.cshtml视图。

这样,如果您要创建一个像Views\Shared\DisplayTemplates\DateTime.cshtml这样的视图,并包含以下内容:

@model DateTime
@Model.Humanize()

然后,只需调用@Html.DisplayFor(m => m.EndDate)即可返回您要查找的人性化日期。由于EndDateDateTime,因此DisplayFor将使用您的DateTime.cshtml模板,该模板输出模型(您的DateTimeHumanized链接在一起。

指定显示模板的另一种方法是直接传递它。当您遇到一次性情况并且不希望模板应用于特定类型的一切时,这很有用。例如,如果您只想将EndDate人性化,但其他日期要正常显示,则可以通过执行以下操作来实现:

@Html.DisplayFor(m => m.EndDate, "HumanizedDate")

您当然会需要一个关联的HumanizedDate.cshtml。如果您希望将此属性保留在视图之外,也可以在模型中使用UIHint,如上文所述。

总而言之,当涉及复杂的结构时,最好利用显示模板。正如Stephen在问题下方的评论中指出的那样,您可以轻松地做到:@Model.EndDate.Humanize(),它不仅比@Html.DisplayFor(m => m.EndDate)更简洁明了,而且不需要向其中添加自定义视图或属性您的模型属性。