我在视图中有一些代码可以显示可为空的DateTime:
@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")
或(在显式创建带有“Testing”文本的“Test”模板之后)@ Html.DisplayForModel(“Test”) )`。我试过这些测试的各种排列。日期始终呈现为空。
我特别需要DateOrNone DisplayTemplate来调用DisplayFor/DisplayForModel
,以便使用正确的DisplayTemplate显示DateOfBirth。我可以从DateTime DisplayTemplate中获取代码并将其复制到DateOrNone文件中,但这种方法无法使代码变为DRY。
有关正确渲染日期的任何建议吗?
答案 0 :(得分:1)
据推测,您创建了一个名为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
。
答案 1 :(得分:0)
您忘记格式化DateTime
,请尝试
@model DateTime?
@Model.ToLongDateString()