Проверка ввода только времени в 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, но хотел бы, чтобы он был на этой странице
Можно ли это сделать для поля "время"?
Ответы
Ответ 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 входов хотя я не совсем уверен, когда это необходимо. Этот ответ должен получить вас на полпути. К сожалению, я не уверен, что этот ответ предотвращает обратную передачу, но это означает, что модель недействительна.