在 MVC5 中使用 Html.DisplayFor() 的日期格式

Posted

技术标签:

【中文标题】在 MVC5 中使用 Html.DisplayFor() 的日期格式【英文标题】:Date Format using Html.DisplayFor() in MVC5 【发布时间】:2013-11-24 02:18:03 【问题描述】:

参考这个post中的答案我添加了/Views/Shared/DisplayTemplates并添加了一个名为ShortDateTime.cshtml的局部视图,如下所示:

@model System.DateTime
@Model.ToShortDateString()

当模型包含一个有效的值并且格式化的日期显示正确时:

@Html.DisplayFor(modelItem => item.BirthDate, "ShortDateTime")

但是,如果返回空值,则会引发“System.InvalidOperationException”。表示:

"传入字典的模型项为空,但此字典需要'System.DateTime'类型的非空模型项。"

我的第一个倾向是在局部视图中使用 if 语句,但这似乎并不重要。不引用模板空值的处理方式如下:

@Html.DisplayFor(modelItem => item.BirthDate)

但格式的原始问题仍然存在。当我尝试按如下方式在视图中放置条件格式时,它不起作用,但我希望它只是一个语法问题。

@Html.DisplayFor(modelItem => item.BirthDate == null) ? string.Empty : (modelItem => item.BirthDate, "ShortDateTime"))

以上结果导致不同的“System.InvalidOperationException”:

"模板只能与字段访问、属性访问、单维数组索引或单参数自定义索引器表达式一起使用。"

那么,有没有办法在 View 中进行条件格式设置以仅从 DateTime 值生成日期?

【问题讨论】:

【参考方案1】:

您遇到的问题是您将null 值传递给不可为空的模型。将局部视图的模型更改为DateTime?。例如:

@model DateTime?          
@if (!Model.HasValue)
    
    <text></text>

else

    @Model.Value.ToShortDateString()

希望这会有所帮助。

【讨论】:

不幸的是 System.DateTime 不包含 HasValue 的定义。 Greg,请注意我将模型类型更改为可为空的 DateTime 或 DateTime?。这就是HasValue 方法的来源。 另外,我应该提到可空的日期时间模型类型能够接收不可空的日期时间。因此,无需创建另一个版本的局部视图来处理不可为空的 DateTime 值。最后,我昨晚确实设置了一个小测试,以确保我上面给你的代码是正确的和有效的。如果您将代码粘贴到 ShortDateTime 部分视图中,您应该立即停止接收您最初报告的错误。从那里,您可以通过将 ToShortDateString() 替换为您想要的任何格式来修改 DateTime 的格式。 @Vinney 的答案对我有用,应该标记为答案。 谢谢,@WalterdeJong!我同意那个。 :)【参考方案2】:

你试过了吗?

@if (modelItem.BirthDate != null)  Html.DisplayFor(modelItem => item.BirthDate, "ShortDateTime") 

【讨论】:

不太奏效,但肯定让我走上了正确的道路,这只是一个语法问题,如下所示。谢谢。【参考方案3】:

我猜你应该在模型类中将 BirthDate 属性声明为可为空

public DateTime? BirthDate get; set; 

你必须声明为

public DateTime BirthDate get; set; 

这每次都需要一个值。

如果您设置为可为空,则它不会期望值。

【讨论】:

谢谢,但是这些字段在 EF 生成的代码中,并且重新生成会带来额外的维护。是的,我想我可以使用部分课程,但有时您只需要完成即可。【参考方案4】:

通过在 Html 助手之前应用条件语句,只有非空值被传递。

@if (item.BirthDate != null)  @Html.DisplayFor(modelItem => item.BirthDate , "ShortDateTime")

【讨论】:

以上是关于在 MVC5 中使用 Html.DisplayFor() 的日期格式的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有 ef 的情况下在 MVC5 中使用参数进行搜索

如何在mvc5中将文化设置为全局

ASP.NET MVC5 新特性:Attribute路由使用详解

下载使用 MVC5 选择的多个文件

ASP.NET MVC5 :Attribute路由使用详解

MVC5使用SignalR进行双向通信