【问题标题】:Formatting MVC model TimeSpan field格式化 MVC 模型 TimeSpan 字段
【发布时间】:2013-07-10 12:59:22
【问题描述】:

我有一个包含几个时间选择器的 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; }

    ...
}

一如既往地欣赏它!

【问题讨论】:

  • 由于似乎没有人知道如何做到这一点,所以我使用字符串而不是 TimeSpan。知道如何正确地做到这一点仍然很酷。

标签: asp.net-mvc format timespan


【解决方案1】:
[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 类型会容易得多,但它没有更新System.Time 包中现在有一个原生的TimeOfDay 类型,在CoreFXLab 中可用。

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

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

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

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

【讨论】:

  • 这个答案对我来说非常有用。非常感谢!
  • 在提到:“另外,TextBoxFor 方法不会拾取数据注释时非常有用。”你对这条线有什么参考吗?
猜你喜欢
  • 2016-07-04
  • 2023-03-12
  • 2011-07-07
  • 2013-04-04
  • 1970-01-01
  • 2019-10-23
  • 2013-04-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多