在通用时间跨度转换器上使用 DisplayFor

Using DisplayFor on a Generic TimeSpan Converter

我有一个摘要页面,它计算数据库中存储项目的几个平均时间和总时间。所有计算都有效,但由于计算平均值的方式,这些值存储为表示分钟数的双精度值。此处的目标是在 Razor 页面上显示平均值和总计时将其转换为 HH:MM:SS 格式。

我从这里开始。

How to display a TimeSpan in MVC Razor

为我必须显示的每个平均值和总数创建一个助手 class 似乎是一种不好的做法,所以我使用一种方法使解决方案更通用。

public string TSConvert(double minutes)
        {
            return TimeSpan.FromMinutes(minutes).ToString(@"hh\:mm\:ss");
        }

所以这行得通

<td>
     @item.TSConvert(item.SalesAverageTime)
</td>

这不

<td>
     @Html.DisplayFor(modelItem => item.TSConvert(item.SalesTotalTime))
</td>

具体来说,我看到了以下错误:

InvalidOperationException: 模板只能用于字段访问、属性 访问、一维数组索引或单参数自定义索引器表达式。

有没有办法让这个方法与 DisplayFor 配合得很好?如果不是,像我上面那样绕过 DisplayFor 有很大的影响吗?

这里发生了一些不同的事情:

错误是因为您没有使用 DisplayFor 来显示对象属性。而是使用 @Html.Raw:

<td>
     @Html.Raw(item.TSConvert(item.SalesTotalTime))
</td>

此外,我建议使用单独的 class(甚至是扩展方法),而不是将 convert 方法放在您的对象上。例如:

public class TimeUtils {
    public static string TSConvert(double minutes)
    {
        return TimeSpan.FromMinutes(minutes).ToString(@"hh\:mm\:ss");
    }
}

然后这样称呼它:

<td>
     @Html.Raw(TimeUtils.TSConvert(item.SalesTotalTime))
</td>

这样您就可以在需要时将其与另一个 class 重复使用。