asp.net - 如何在 @Html,DisplayFor() 中使用 Humanize
问题描述
我怎样才能在里面人性化地显示日期DisplayFor
?
我试过这样:@Html.DisplayFor(model =>model.EndDate.Humanize())
但编辑器显示如下错误:
表达式树可能不包含使用可选参数的调用或调用
解决方案
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
is a DateTime
,DisplayFor
将使用您的DateTime.cshtml
模板,该模板输出模型(您的DateTime
with Humanized
chained.
指定显示模板的另一种方法是直接传递它。当您遇到一次性情况并且不希望模板应用于特定类型的所有内容时,这很有用。例如,如果您只想EndDate
人性化,但其他日期正常显示,可以通过执行以下操作来实现:
@Html.DisplayFor(m => m.EndDate, "HumanizedDate")
那么你当然需要一个关联的HumanizedDate.cshtml
. UIHint
如果您希望将其保留在视图之外,也可以在您的财产上使用,如上文所述,而是在您的模型上使用。
尽管如此,当涉及复杂的结构时,最好使用显示模板。正如斯蒂芬在您的问题下方的评论中指出的那样,您可以轻松地执行以下操作:@Model.EndDate.Humanize()
,这不仅比 更简洁明了@Html.DisplayFor(m => m.EndDate)
,而且不需要向模型属性添加自定义视图或属性。
推荐阅读
- swift - 修复 Xcode 快速帮助检查器的参数部分中的“无描述”
- git - 不同的分支共享一个索引文件?
- sql - PostgreSQL 选择通过多对多枢轴连接的表的多个列
- vb.net - vb.net 使用不同的参数执行相同的 sub 两次
- javascript - 我正在尝试将 JavaScript 数据发送到我的 NodeJS 服务器
- javascript - 我可以从 FlatList 中的 URI 渲染图像吗
- mysql - 在 MySQL 中修改数据库时在 Spark 中删除的行
- bash - 计算字符的出现
- c++ - 使用 NULL 句柄调用 dlsym() 不会返回 NULL,而是返回一个随机函数
- r - 如何根据另一列的部分字符串创建新列