如何在DisplayFor
中人性化显示日期?
我这样尝试过:@Html.DisplayFor(model =>model.EndDate.Humanize())
但是编辑器显示如下错误:
表达式树可能不包含使用以下内容的调用或调用 可选参数
答案 0 :(得分:1)
Html.DisplayFor
是模板化的帮助程序,仅表示它使用模板返回模型表达式的值。默认模板只是在模型表达式引用的属性上调用ToString()
。这样,您传递给它的内容必须是引用特定属性的模型表达式。您不能在其上执行类似致电Humanize
的操作。
但是,您可以定义自己的模板。这需要在Views\Shared\DisplayTemplates
中创建一个符合以下命名约定之一的视图:
以应使用的类型命名,例如DateTime.cshtml
将应用于类型为DateTime
的任何属性。
以DataType
枚举的成员之一命名,在这种情况下,当将DataType
应用于特定属性(例如应用属性Date.cshtml
时将使用[DataType(DataType.Date)]
。
您可以随意命名,但是可以使用UIHint
属性为该属性明确指定该名称,例如如果您应用[UIHint("MyAwesomeDateTime")]
之类的属性,并且将使用关联的MyAwesomeDateTime.cshtml
视图。
这样,如果您要创建一个像Views\Shared\DisplayTemplates\DateTime.cshtml
这样的视图,并包含以下内容:
@model DateTime
@Model.Humanize()
然后,只需调用@Html.DisplayFor(m => m.EndDate)
即可返回您要查找的人性化日期。由于EndDate
是DateTime
,因此DisplayFor
将使用您的DateTime.cshtml
模板,该模板输出模型(您的DateTime
与Humanized
链接在一起。>
指定显示模板的另一种方法是直接传递它。当您遇到一次性情况并且不希望模板应用于特定类型的一切时,这很有用。例如,如果您只想将EndDate
人性化,但其他日期要正常显示,则可以通过执行以下操作来实现:
@Html.DisplayFor(m => m.EndDate, "HumanizedDate")
您当然会需要一个关联的HumanizedDate.cshtml
。如果您希望将此属性保留在视图之外,也可以在模型中使用UIHint
,如上文所述。
总而言之,当涉及复杂的结构时,最好利用显示模板。正如Stephen在问题下方的评论中指出的那样,您可以轻松地做到:@Model.EndDate.Humanize()
,它不仅比@Html.DisplayFor(m => m.EndDate)
更简洁明了,而且不需要向其中添加自定义视图或属性您的模型属性。