3

所以我有一个以秒为单位的视频持续时间,我想在 Razor 中显示该持续时间。

目前我正在使用

@TimeSpan.FromSeconds(item.Duration).ToString()

但是我正在使用的其余代码使用

@Html.DisplayFor(modelItem => item.Description)

有没有办法让持续时间(当前是一个 int)将 a 显示为时间跨度?使用@Html.DisplayFor语法。item.duration 从实体框架模型中提取,该模型在数据库中作为 int 保存。

4

3 回答 3

13

约翰,

创建您自己的显示模板。为此,请按照下列步骤操作:

  1. 在 Views/Shared 下创建一个名为 DisplayTemplates 的文件夹
  2. 在该新文件夹下,创建一个名为 TimeSpan.cshtml 的局部视图
  3. 现在,在您看来,每当您遇到一个时间跨度的模型属性时,它都会由 TimeSpan DisplayTemplate 自动呈现。
  4. 为您的模型添加一个新的 get 属性。

模型编辑(添加以下内容):

public TimeSpan MyTimeSpanProperty
{
    get
    {
        return TimeSpan.FromSeconds(Duration);
    }
}

时间跨度.cshtml

@model TimeSpan
@string.Format("{0}:{1}:{2}", Model.Hours, Model.Minutes, Model.Seconds)

在您的视图中调用为

@Html.DisplayFor(m => m.MyTimeSpanProperty)

这将显示为3:24:16等。

这就是它的全部内容(它假设您将传递一个 TimeSpan 类型的属性,所以如果可能的话,看看您是否可以对您的模型进行微小的更改!!)

于 2012-06-27T16:50:56.977 回答
4

您可以使用partial class定义扩展您的模型类。

public partial class My_class_that_has_been_created_by_EF {
    public string Timespan {
        get { 
            return Timespan.FromSeconds(Duration).ToString(); 
        }
    }
}

然后在您的视图中使用它

@Html.DisplayFor(modelItem => item.Timespan)
于 2012-06-27T15:12:34.753 回答
2

您应该利用DataAnnotations命名空间和DisplayTemplatesASP.NET MVC

  1. 首先使用 Attribute 屏蔽您的UIHint属性并将模板设置为VideoDurationModels /YourVideoModel.cs

    [UIHint("VideoDuration")]
    public int Duration { get; set; }
    
  2. 在Views/Shared/DisplayTemplates/ VideoDuration .cshtml向您的项目添加显示模板(DisplayTemplates如果文件夹不存在,您可能需要添加文件夹)

    @model int?
    @string.Format("{0:g}", TimeSpan.FromSeconds(Model))
    

然后你可以像这样在你的视图中使用它:

@Html.DisplayFor(m => m.Duration)
于 2014-02-15T02:51:52.150 回答