为什么“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.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()