【问题标题】:How to use Humanize inside @Html,DisplayFor()如何在 @Html,DisplayFor() 中使用 Humanize
【发布时间】:2018-10-25 11:58:54
【问题描述】:

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

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

但编辑器显示如下错误:

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

【问题讨论】:

  • 您不能在表达式中使用方法。 .Humanize() 是什么?
  • Humanize - Humanizer 包中的函数,以可读方式显示日期时间,例如:20.10.2018 >> 5 天前
  • 那么就使用@Model.EndDate.Humanize() - 在你的情况下使用DisplayFor() 是没有意义的
  • Stephen Muecke,谢谢你的帮助,你是对的)

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


【解决方案1】:

Html.DisplayFor 是一个模板化帮助器,这意味着它使用模板返回模型表达式的值。默认模板只是在模型表达式引用的属性上调用ToString()。因此,您传递给它的必须是引用特定属性的模型表达式;你不能这样做,比如打电话给Humanize

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

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

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

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

因此,如果您要使用内容创建像 Views\Shared\DisplayTemplates\DateTime.cshtml 这样的视图:

@model DateTime
@Model.Humanize()

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

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

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

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

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

【讨论】:

  • Chris Pratt,非常感谢,您解释得这么清楚,尊重
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-05
  • 1970-01-01
  • 1970-01-01
  • 2022-10-14
  • 2011-09-23
  • 2018-02-24
相关资源
最近更新 更多