【问题标题】:Formatting TimeSpan - MVC C# Razor DisplayFor格式化 TimeSpan - MVC C# Razor DisplayFor
【发布时间】:2016-07-04 00:36:07
【问题描述】:

我有 DisplayFor 以这种格式显示时间跨度值(持续时间): 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>

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

输入字符串的格式不正确。 --> "@Html.DisplayFor(modelItem => item.Ticket.Duration)"

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

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

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

【问题讨论】:

  • 如果您将Duration 属性设为TimeSpan(而不是TimeSpan?),您的问题会消失吗?我怀疑这是因为您的模板声明为TimeSpan 而不是Nullable&lt;TimeSpan&gt;
  • 我认为您是对的,可空部分可能是问题的一部分。我需要可空时间跨度,因为我的数据库中的某些记录还没有持续时间。
  • 您不应该从modelItem 而不是item 获得票吗? @Html.DisplayFor(modelItem =&gt; modelItem.Ticket.Duration)
  • 这与我的问题并不真正相关,但不是 - 我的 foreach 循环状态 '@foreach (var item in Model) { }'
  • 我的主要问题是 - 如何将我的日期时间从我的视图模板转换为字符串而不会出现格式异常错误? :)

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


【解决方案1】:

看完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)]

【讨论】:

    【解决方案2】:

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

    您将能够执行以下操作:

    SolvedDate.Humanize();
    

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

    【讨论】:

    • 我真的不想引入一个全新的库来解决这个问题,因为它应该不那么复杂。我想我在这里遗漏了一些简单的东西。:)
    【解决方案3】:

    您的时间跨度可以为空,因此请尝试:

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

    【讨论】:

    • 我不认为我可以将 DisplayFor 更改为标签,并且我无法弄清楚我应该使用的语法来获取 linq-query modelItem => item.Ticket.Duration 进入您的行。 .
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-08
    • 2023-03-12
    • 2013-04-04
    • 2017-06-07
    • 2019-10-23
    相关资源
    最近更新 更多