【问题标题】:Use DisplayFormat in Asp.Net Core to display elapsed time在 Asp.Net Core 中使用 DisplayFormat 显示经过的时间
【发布时间】:2018-10-16 14:49:41
【问题描述】:

我有一个 ViewModel 类,其中包含一个名为 Duration 的列,其中包含两个 DatetTime 列之间的小时数(在查询中计算):

public Int32 Duration { get; set; }

我希望我可以使用注释来显示经过的时间量,以天和小时为单位(例如0d 15h)。

这不起作用:

[DisplayFormat(DataFormatString = "{0:dd hh}")]

使用TimeSpan的逻辑:

DateTime s;
DateTime.TryParse("2015-03-18 15:00:42.920",out s);
DateTime e;
DateTime.TryParse("2015-03-19 06:52:44.440",out e);
TimeSpan t = e - s;
Console.WriteLine(String.Format("{0}d {1}h", t.Days, t.Hours));

有没有办法使用数据注释(单独)来实现这一点?

【问题讨论】:

  • 没有。数据注解必须是常量,不能这样计算。
  • 也就是说,如果您的Duration 属性实际上是TimeSpan 而不是int,您可以直接使用您的格式字符串。
  • @ChrisPratt,您是否建议使用一个直接映射到查询数据类型的模型(包括 DurationInt32),然后使用 Automapper 将该数据集转换为视图模型有Duration 作为TimeSpan?
  • 但是,您想要/需要这样做。简单地说,将您的属性作为 int,您不能使用 DisplayFormat 来实现您正在寻找的格式,因为您无法执行必要的计算来到达那里。如果您的属性是TimeSpan,您可以成功使用DisplayFormat。如果您需要自定义视图模型来实现这一点,那么这就是您必须做的,或者只是手动进行计算和字符串格式化。

标签: asp.net-core asp.net-core-mvc asp.net-core-2.1


【解决方案1】:

我决定在视图中添加一个函数:

public string Elapsed(Int32 duration)
{
    TimeSpan t = TimeSpan.FromHours(duration);
    return String.Format("{0}d {1}h", t.Days, t.Hours);
}

然后引用它:

<td> @Elapsed(item.Duration) </td>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-15
    • 1970-01-01
    • 2019-12-19
    • 1970-01-01
    • 2015-03-29
    • 1970-01-01
    相关资源
    最近更新 更多