DateTime值错误地绑定小时

时间:2018-03-05 20:20:42

标签: asp.net-mvc datetime data-binding datetime-format editorfor

我在订单表单页面上有一个@HTML.EditorFor,用户可以选择一个时间来领取订单。我将值保存在Session中,并在Review页面中获取。用户可以决定编辑它们被发送回订单表单的位置以及之前绑定的值。除拾取时间外,所有其他值都正确绑定,但仅限小时。分钟正确绑定,但由于某种原因,小时始终显示为3.我在调试时观察了该值;即使在绑定后,该值始终是正确的,但它始终显示为3。

我的模特

[Required(ErrorMessage = "Pickup time is required")]
[DisplayName("Pickup time")]
[DisplayFormat(DataFormatString = "{0:h:mm tt}")]
[DataType(DataType.DateTime)]
public DateTime PickupTime { get; set; }

我的视图

@Html.EditorFor(model => model.Order.PickupTime, new { htmlAttributes = new 
{ @class = "form-control" } })

我正在从视图模型中创建一个新的Order对象:

Order order = new Order() {
    PickupTime = ofvm.Order.PickupTime
};

我尝试过不同的DataFormatStrings,使用TempData和ViewBags代替Sessions。所有这些值总是正确的,但无论小时值是多少,它总是显示为3.有没有人知道发生了什么?

1 个答案:

答案 0 :(得分:0)

我找到了解决方案。对我来说,为什么它没有正确绑定仍然没有任何意义。但是修正它的原因是将.TimeOfDay添加到EditorFor控件中的Linq表达式,所以不是这样:

@Html.EditorFor(model => model.Order.PickupTime, new { htmlAttributes = new 
{ @class = "form-control" } }) // Always displayed '3' as the hour, no matter the value

我这样做了:

@Html.EditorFor(model => model.Order.PickupTime.TimeOfDay, new { 
htmlAttributes = new { @class = "form-control" } }) // Displays correct hour value

现在小时正确绑定。我认为DataFormatString属性就足够了,因为价值就在那里,但由于某种原因它只是没有用。所以从现在开始,每当我需要将时间值绑定到EditorFor控件时,我就不会使用格式字符串。