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

时间:2014-12-08 16:36:40

标签: c# asp.net-mvc-4 datetime nullable

我在视图中有一些代码可以显示可为空的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。

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

2 个答案:

答案 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()