在MVC5中使用Html.DisplayFor()格式化日期时间

6

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

@model System.DateTime
@Model.ToShortDateString()

当模型包含一个值时,这个方法可以正常工作并且格式化后的日期会正确显示:
@Html.DisplayFor(modelItem => item.BirthDate, "ShortDateTime")

然而,如果返回一个空值,则会抛出“System.InvalidOperationException”异常。这表示:

{"字典中传递的模型项为 null,但该字典需要一个类型为 'System.DateTime' 的非 null 模型项。"}

我的第一个想法是在局部视图中使用 if 语句,但似乎并没有关系。不引用模板,则处理空值的方式如下:

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

但是格式问题仍然存在。当我尝试在视图中添加条件格式时,它不起作用,但我希望这只是语法的问题。

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

以上结果会导致不同的 'System.InvalidOperationException':

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

那么,是否有一种在视图中进行条件格式化以从DateTime值中生成仅日期的方法?

4个回答

4
你遇到的问题是将一个 null 值传递给了一个不可为空的模型。将部分视图的模型更改为 DateTime?。例如:
@model DateTime?          
@if (!Model.HasValue)
    {
    <text></text>
}
else
{
    @Model.Value.ToShortDateString()
}

希望这能帮到你。

1
很遗憾,System.DateTime没有包含HasValue的定义。 - Greg Hayden
2
Greg,注意我将模型类型更改为可空的DateTime或DateTime?。这就是HasValue方法的来源。 - Vinney Kelly
另外,我应该提到可空的DateTime模型类型能够接收非可空的DateTime。因此,没有必要为处理非可空DateTime值创建另一个部分视图版本。最后,昨晚我设置了一个小测试来确保我给你的代码是正确和功能性的。如果你将代码粘贴到你的ShortDateTime部分视图中,你应该立即停止接收你最初报告的错误。从那里开始,你可以通过用任何你想要的格式替换'ToShortDateString()'来修改DateTime的格式。 - Vinney Kelly
1
@Vinney 的回答对我有帮助,应该标记为最佳答案。 - Walter de Jong
谢谢,@WalterdeJong!我赞同。 :) - Vinney Kelly

1

你试过这个吗?

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

虽然没有完全成功,但确实让我走上了正确的道路,只是语法问题,如下所示。谢谢。 - Greg Hayden

0

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

public DateTime? BirthDate{ get; set; }

你必须已经声明为

public DateTime BirthDate{ get; set; }

每次都需要一个值。

如果将其设置为可空,则不需要值。


谢谢,但这些字段是由EF生成的代码,重新生成会增加额外的维护工作。是的,我想我可以使用部分类,但有时你只需要完成它。 - Greg Hayden

0
通过在Html辅助程序之前应用条件语句,只有非空值才会被传递。
@if (item.BirthDate != null) { @Html.DisplayFor(modelItem => item.BirthDate , "ShortDateTime")}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接