在强类型视图中格式化可为空的DateTime字段

时间:2010-09-10 10:55:25

标签: asp.net-mvc asp.net-mvc-2 defaultmodelbinder

我的模型中有一个带有BornDate属性的Person类,定义为

[DisplayName("Born Date")]
public DateTime? BornDate { get; set; }

我在视图中使用此字段

<td style="white-space:nowrap">
    <%= Html.LabelFor(model => model.BornDate)%>
    <br />
    <%= Html.TextBoxFor(model => model.BornDate, new { id = "bornDate" })%>
    <%= Html.ValidationMessageFor(model => model.BornDate, "*")%>
</td>

问题在于,当我使用BornDate文本框编辑Person实例时,格式为

dd/MM/yyyy hh.mm.ss

虽然我想在没有时间部分(“dd / MM / yyyy”)的情况下格式化它。我无法将toString方法与格式字符串一起使用,因为它是可以为空的字段。

我该怎么办?

5 个答案:

答案 0 :(得分:11)

您应该可以使用Value。请先检查它是否为空。

var displayDate = model.BornDate.HasValue ? model.BornDate.Value.ToString("yyyy") : "NoDate";

答案 1 :(得分:9)

我知道这已经很晚了,但我正在研究另一个问题并遇到了这个问题。有一种方法只显示不需要表示层格式化的日期部分。

[DisplayName("Born Date")]
[DataType(DataType.Date)]
public DateTime? BornDate { get; set; }

使用此功能可确保在View上绑定此属性的任何位置,只显示日期

希望这有助于某人

答案 2 :(得分:5)

要在VIEW中执行此操作,您还可以使用Razor语法:

 @Html.TextBox("BornDate", item.BornDate.HasValue ? item.BornDate.Value.ToShortDateString():"") 

答案 3 :(得分:2)

你可以这样做,它可以使用Nullable模型类型:

@model DateTime?
@{
    object txtVal = "";
    if (Model.HasValue) 
    {
        txtVal = Model.Value;
    };
}
@Html.TextBoxFor(x => Model, new {Value = string.Format(ViewData.ModelMetadata.EditFormatString, txtVal))

答案 4 :(得分:0)

我解决此问题的另一种方法是将格式添加到TextBoxFor

@Html.TextBoxFor(model => model.BornDate, "{0:MM/dd/yyyy}", new { id = "bornDate" })