格式化MVC模型TimeSpan字段

时间:2013-07-10 12:59:23

标签: asp.net-mvc format timespan

我有一个包含几个时间选择器的MVC页面。它们作为可空TimeSpan存储在模型中的对象列表中。问题是我将带有秒的打印时间输入到输入字段中。有没有办法格式化这些模型属性,以便我以其他方式打印时间跨度(如7:00,而不是07:00:00)?不用说,我对[DisplayFormat...]的“建议”没有用。至少不是我希望的方式。

输入字段的定义如下:

@Html.TextBoxFor(x => x.Shifts[i].Start)

该模型的相关部分如下:

public class Workshift
{
    [DisplayFormat(Something here perhaps?)]
    public TimeSpan? Start { get; set; }
    public TimeSpan? End { get; set; }
    public TimeSpan? Pause { get; set; }
}

public class TimeRegistrationViewModel
{
    public List<Workshift> Shifts { get; set; }

    ...
}

一如既往地欣赏它!

1 个答案:

答案 0 :(得分:30)

[DisplayFormat(DataFormatString="{0:hh\\:mm}", ApplyFormatInEditMode = true)]
public TimeSpan? Start { get; set; }

[DisplayFormat(DataFormatString="{0:hh\\:mm}", ApplyFormatInEditMode = true)]
public TimeSpan? End { get; set; }

[DisplayFormat(DataFormatString="{0:hh\\:mm}", ApplyFormatInEditMode = true)]
public TimeSpan? Pause { get; set; }

但请记住,TimeSpan的主要目的是表示一段时间,而不是一天中的某个时间。这意味着TimeSpan值可能超过24小时。它们也可以是负数,表示在时间轴上向后移动。

可接受将它们用作时间,并且实际上由框架本身完成(例如,DateTime.TimeOfDay)。但是当以这种方式使用时,您应该仔细验证用户输入。如果您只依赖于数据类型,则用户可能能够输入有效时间跨度的值,但不能输入有效的日期时间。例如,-1.22:33:44是一个有效的TimeSpan,代表过去中的1天,22小时,33分44秒

如果.Net有一个本地Time类型,但它不是会更容易。 更新CoreFXLab中的TimeOfDay包中现在有System.Time种原生{。}}。

此外,TextBoxFor方法不会获取数据注释。您可以直接将格式字符串指定为参数,如下所示:

@Html.TextBoxFor(x => x.Shifts[i].Start, "{0:hh\\:mm}")

或者您可以像这样切换到EditorFor

@Html.EditorFor(x => x.Shifts[i].Start)