为什么“DateTime?”DisplayTemplate 为 DisplayForModel() 呈现空文本

本文关键字:文本 DisplayForModel DateTime DisplayTemplate 为什么 | 更新日期: 2023-09-27 18:33:28

我的视图中有一些代码来显示可为空的日期时间:

@if (this.Model.DateOfBirth.HasValue)
{
    @Html.DisplayFor(model => model.DateOfBirth)
}
else
{
    @: None
}

我计划在几个地方使用同样的东西,所以我创建了一个非常简单的DisplayTemplate。结果:

查看中的代码:

@Html.DisplayFor(model => model.DateOfBirth, "DateOrNone")
''

views''Shared''DisplayTemplates''DateOrNone.cshtml 中的代码

@model DateTime?
@if (this.Model.HasValue)
{
    @Html.DisplayForModel()
}
else
{
    @: None
}

如果属性为 null,则此方法非常有效,但如果它具有非 null 值,则不会呈现任何内容。我还尝试将Html.DisplayForModel()更改为Html.DisplayFor(m => m)Html.DisplayFor(m => m.Value),结果相同。

我还尝试显式设置DisplayTemplate以在DateOrNone中使用,如下所示:@Html.DisplayForModel("Date")或(在显式创建带有文本"测试"的"测试"模板后(@Html.DisplayForModel("Test"("。我尝试了这些测试的各种排列。日期始终呈现为空。

我特别需要 DateOrNone DisplayTemplate 来调用DisplayFor/DisplayForModel以便使用正确的 DisplayTemplate 显示 DateOfBirth。我可以从 DateTime DisplayTemplate 中获取代码并将其复制到 DateOrNone 文件中,但这违背了使代码干燥的意义。

关于正确渲染日期的任何建议?

为什么“DateTime?”DisplayTemplate 为 DisplayForModel() 呈现空文本

大概,您创建了一个名为 DateTime.cshtml 的显示模板,对吗?好吧,这就是DisplayFor/DisplayForModel将使用的,因此当您在显示模板本身中调用它们时,您实际上会导致呈现同一模板的无限循环。我以前从未尝试过这样的事情,但大概,Razor 只是举起双手,什么也没返回,而不是错误地出现在你身上。

您的显示模板实际上应该定义应该显示的内容,因此您应该执行以下操作:

@model DateTime?
@if (Model.HasValue)
{
    @(string.Format(ViewData.ModelMetadata.DisplayFormatString ?? "{0:MMMM d, yyyy}", Model.Value))
}
else
{
    @:None
}

而不是打电话给Html.DisplayForModel.

你忘了格式化DateTime,试试

@model DateTime?
@Model.ToLongDateString()