7

I am building a Scheduling Screen and need to display a Time field for users to enter the time of day for the schedule.

I'm not sure if this is the best option, but I am using a TimeSpan for the field. To validate the input, I want to use the Range attribute and the DisplayFormat attribute.

When I debug and enter a seeming valid value, the Range attribute indicates an out of range error. Can anyone see what I am doing wrong? Is TimeSpan the proper type for this usage? Any help is greatly appreciated.

Model Class:

public class Schedule
{
    public Schedule()
    {
        this.ScheduleTime = new TimeSpan(0, 0, 0);
    }

    /// <summary>
    /// The time of day for the schedule to run
    /// </summary>
    [Required, DataType(System.ComponentModel.DataAnnotations.DataType.Time),
    Display(Name = "Schedule Time", Description = "Number of Hours and Minutes after Midnight Central Timezone"),
    DisplayFormat(DataFormatString = @"{0:hh\:mm\:ss}", ApplyFormatInEditMode = true),
    Range(typeof(TimeSpan), "00:00", "23:59")]
    public TimeSpan ScheduleTime { get; set; }
}

Error Message:

Error Message

2
  • I'm not sure about the validation side, but I would use a DateTime object - TimeSpan represents a duration of time, while DateTime represents an actual time. Commented Sep 4, 2013 at 22:24
  • Thanks @TheEvilPenguin, I considered using DateTime but figured I would have to create a custom attribute to validate just the time. Also, the API I'm using has this value as a TimeSpan, so luckily I found the post I mentioned in my answer and it seems to work fine.
    – Josh Jay
    Commented Sep 4, 2013 at 23:17

3 Answers 3

16

I found this question while looking for a similar problem and I want to say for the records that range validation works well in ASPNET Core 2 and JQuery v2.2.0.

[Range(typeof(TimeSpan), "00:00", "23:59")]
1
  • This compiles but doesn't generate validation exceptions for me
    – Moffen
    Commented Feb 28 at 1:50
7

I know this is an old post, but i was able to keep the client side validation using a regular expression rather than the range validation like so:

    [Display(Name = "Schedule Time ")]
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:hh\\:mm}")]
    [RegularExpression(@"((([0-1][0-9])|(2[0-3]))(:[0-5][0-9])(:[0-5][0-9])?)", ErrorMessage = "Time must be between 00:00 to 23:59")]
    public System.TimeSpan? ScheduleTime { get; set; }
2

You know those times where you ask a question and shortly after the answer just appears right before you? This is one of those for me.

I found this SO post: why does ASP.Net MVC Range Attribute take a Type?

Which describes the issue as jQuery being unable to handle the Range expression so the Client Side Validation won't work, but the Server Side Validation will.

So I removed the client validation for this field with javascript:

<script>
    $(document).ready(function () {
        $("#ScheduleTime").rules('remove', 'range');
    });
</script>

And now the validation works properly when checking the ModelState.IsValid in the controller.

0

Not the answer you're looking for? Browse other questions tagged or ask your own question.