首页 > 解决方案 > 如何在 @Html,DisplayFor() 中使用 Humanize

问题描述

我怎样才能在里面人性化地显示日期DisplayFor

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

但编辑器显示如下错误:

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

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

解决方案


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)将返回您正在寻找的人性化日期。由于EndDateis a DateTimeDisplayFor将使用您的DateTime.cshtml模板,该模板输出模型(您的DateTimewith Humanizedchained.

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

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

那么你当然需要一个关联的HumanizedDate.cshtml. UIHint如果您希望将其保留在视图之外,也可以在您的财产上使用,如上文所述,而是在您的模型上使用。

尽管如此,当涉及复杂的结构时,最好使用显示模板。正如斯蒂芬在您的问题下方的评论中指出的那样,您可以轻松地执行以下操作:@Model.EndDate.Humanize(),这不仅比 更简洁明了@Html.DisplayFor(m => m.EndDate),而且不需要向模型属性添加自定义视图或属性。


推荐阅读