格式化TimeSpan - MVC C#Razor DisplayFor

时间:2016-03-17 15:02:18

标签: c# asp.net-mvc razor timespan displayfor

我有DisplayFor以这种格式显示TimeSpan值(持续时间): 35.04:08:43.2470000(dd.HH:mm:ss.fffffff)。

我的目标是一个人类可读的字符串“HH:mm”,所以我跟着How to display a TimeSpan in MVC Razor和 尝试在~views / Shared / TimeSpanTemplate.cshtml中制作一个DisplayTemplate:

@model TimeSpan
@{
    TimeSpan initialValue = Model;
}
@string.Format("{0}:{1}", (initialValue.Days * 24) + initialValue.Hours, initialValue.Minutes)

@Scripts.Render("~/bundles/bootstrap")

这是我的模特:

[DisplayFormat(DataFormatString = "{0:HH:mm}", ApplyFormatInEditMode = true)]
[DisplayName("Varighed")]
public virtual TimeSpan? Duration
{
   get {
      return SolvedDate.HasValue ? (TimeSpan?)SolvedDate.Value.Subtract(ReportedDate) : null;        }
}

这是我的观点:

<td>
    @Html.DisplayFor(modelItem => item.Ticket.Duration)
</td>

我得到了这个编译格式异常错误:

  

输入字符串的格式不正确。 - &GT;   “@ Html.DisplayFor(modelItem =&gt; item.Ticket.Duration)”

     

System.FormatException未被用户代码
处理   HResult = -2146233033消息=输入字符串不正确   格式。源= mscorlib程序

我已经成功为EditViews创建了DateTime-templates,但我似乎无法在使用TimeSpan类型的DisplayFor上解决这个问题。

我不知道自己在做什么,所以任何线索都值得赞赏! :) 提前谢谢!

3 个答案:

答案 0 :(得分:0)

这不是解决此问题的直接答案,但我认为最好使用Humanizer库。

您可以执行以下操作:

SolvedDate.Humanize();

见这里:https://github.com/Humanizr/Humanizer#humanize-timespan

答案 1 :(得分:0)

您的Timespan可以为空,请尝试:

<td>
    @Html.Label("MyTimeSpan", Model.Ticket.Duration != null ? Model.Ticket.Duration.Value : string.Empty)
</td>

答案 2 :(得分:0)

阅读How can I String.Format a TimeSpan object with a custom format in .NET?

我设法通过取消我的TimeSpanTemplate来解决这个问题,只需在我的模型中编辑此行:[DisplayFormat(DataFormatString = "{0:HH:mm}", ApplyFormatInEditMode = true)]

[DisplayFormat(DataFormatString = "{0:%d}d {0:%h}h {0:%m}m {0:%s}s", ApplyFormatInEditMode = true)]