从TimeSpan EditorFor中删除秒数

时间:2011-06-10 08:09:20

标签: c# asp.net-mvc asp.net-mvc-3 razor

我正在为包含时间跨度的模型在ASP.NET MVC3中创建一个包含表单的视图。我想知道是否有一种方法可以阻止渲染的文本框显示秒部分?那么我会得12:30:00而不是12:30而不是//model [Required] [DataType(DataType.Time)] public TimeSpan Start { get; set; } //view <div class="editor-field"> @Html.EditorFor(model => model.Start) @Html.ValidationMessageFor(model => model.Start) </div>

以下是我在模型和视图中的内容:

{{1}}

非常感谢任何建议。

2 个答案:

答案 0 :(得分:26)

您可以使用[DisplayFormat]属性:

[Required]
[DataType(DataType.Time)]
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = @"{0:hh\:mm}")]
public TimeSpan Start { get; set; }

答案 1 :(得分:0)

Darin的答案有效,但验证仍然没有像我预期的那样有效。我添加了自定义验证。该自定义验证正在执行没有正则表达式属性的正则表达式。这样做,否则你不能发布像14:30这样的时间,因为正则表达式将停止它,或者TimeSpan对象将停止它,因为它期望TimeSpan像00:00:00。

因此,我在Visual Studio 2013 Update 4中使用Entity Framework 6为MVC 5创建了此验证。

public class Training : IValidatableObject
{
    private const string Time = @"^(?:[01][0-9]|2[0-3]):[0-5][0-9]:00$";

    public int Id { get; set; }

    [Display(Name = "Starttime")]
    [DataType(DataType.Time)]
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = @"{0:hh\:mm}")]
    public TimeSpan StartTime { get; set; }

    [Display(Name = "Endtime")]
    [DataType(DataType.Time)]
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = @"{0:hh\:mm}")]
    public TimeSpan EndTime { get; set; }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        var results = new List<ValidationResult>();

        Regex timeRegex = new Regex(Time);

        if (!timeRegex.IsMatch(StartTime.ToString()))
        {
            results.Add(new ValidationResult("Starttime is not a valid time hh:mm", new[] { "StartTime" }));
        }

        if (!timeRegex.IsMatch(EndTime.ToString()))
        {
            results.Add(new ValidationResult("Endtime is not a valid time hh:mm", new[] { "EndTime" }));
        }

        return results;
    }
}