Подтвердить что ты не робот

Проверка ввода только времени в asp.net MVC ненавязчивая проверка

У меня есть два отдельных поля на странице: один для даты и один для времени.

Это модель:

[Required]
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:hh:mm tt}")]
public DateTime? StartTime { get; set; }

[Required]
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:MM/dd/yyyy}")]
public DateTime Date { get; set; }

Это представление:

@Html.TextBoxFor(m => m.Date, "{0:MM/dd/yyyy}", new { type = "text" })
@Html.TextBoxFor(m => m.StartTime, "{0:hh:mm tt}", new { type = "text", id = "timeStart" })

Несвязанная проверка javascript отлично работает с полем Date, однако, когда я вхожу "11:00 PM" или "11:00 pm" в StartTime, проверка показывает

"Поле StartTime должно быть датой"

Проверка на стороне сервера отлично работает с "0:hh:mm tt", это только javascript, у которого есть проблема. На данный момент я просто отключил проверку JavaScript, но хотел бы, чтобы он был на этой странице

Можно ли это сделать для поля "время"?

4b9b3361

Ответ 1

Честно говоря, самый простой способ добиться этого - использовать для него средство проверки регулярных выражений. Вот пример.

[RegularExpression(@"^(0[1-9]|1[0-2]):[0-5][0-9] (am|pm|AM|PM)$", ErrorMessage = "Invalid Time.")]

Ненавязчивая проверка должна отлично работать с этим выражением.

Надеюсь, это поможет вам!

ИЗМЕНИТЬ

Я исправил регулярное выражение, которое запустило ошибки в консоли из-за некоторых незаконных символов. Кроме того, для этого свойства вам понадобится оболочка свойств строки, иначе она всегда будет искать допустимый DateTime.

Ниже вы должны быть привязаны к.

Модель:

public DateTime? StartTime { get; set; }

[Required]
[RegularExpression(@"^(0[1-9]|1[0-2]):[0-5][0-9] (am|pm|AM|PM)$", ErrorMessage = "Invalid Time.")]
public string StartTimeValue
{
    get
    {
        return StartTime.HasValue ? StartTime.Value.ToString("hh:mm tt") : string.Empty;
    }

    set
    {
        StartTime = DateTime.Parse(value);
    }
}

Вид:

@Html.TextBoxFor(m => m.StartTimeValue)

Ответ 2

Добавьте DataType.Time атрибут в свое поле времени и используйте EditorFor, чтобы удалить дублирование формата:

Model

    [Required]
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:hh:mm tt}")]
    [DataType(DataType.Time)]
    public DateTime? StartTime { get; set; }

    [Required]
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:MM/dd/yyyy}")]
    public DateTime Date { get; set; }

Вид

    @Html.EditorFor(m => m.Date, new { type = "text" })
    @Html.EditorFor(m => m.StartTime, new { type = "text", id = "timeStart" })

Ответ 3

В вашей модели просмотра попробуйте

    [Display(Name = "Start Time")]
    [Time]
    [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:hh:mm tt}")]
    public DateTime Time { get; set; }

и имеют класс атрибутов

public class TimeAttribute : ValidationAttribute, IClientValidatable
{
    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata,
                                                                        ControllerContext context)
    {
        yield return new ModelClientValidationRule
        {
            ErrorMessage = ErrorMessage,
            ValidationType = "time"
        };
    }

    public override bool IsValid(object value)
    {
        DateTime time;
        if (value == null || !DateTime.TryParse(value.ToString(), out time))
            return false;

        return true;
    }
}

EDIT: Я также знаю, что в некоторых случаях вам нужно добавить некоторые скрипты в клиентский html, такой как найденный в этом ответе ненавязчивая группа проверки MVC3 входов хотя я не совсем уверен, когда это необходимо. Этот ответ должен получить вас на полпути. К сожалению, я не уверен, что этот ответ предотвращает обратную передачу, но это означает, что модель недействительна.