2014-01-30 2 views
0

Я хотел бы знать, как установить условное требование для свойства DateTime. То есть, кроме того, чтобы проверить, пустое ли это обязательное поле, я хочу, чтобы вход (в файле cshtml) был не раньше, чем через 3 недели с сегодняшнего дня.Обязательное поле - условное выражение/проверка

Модель:

[DataType(DataType.Date)] 
[Display(Name = "Start date"), Required(ErrorMessage = ValidationMessages.IsRequired)] 
//[What else here for this condition??] 
public DateTime StartDate { get; set; } 

.cshtml:

<div class="form-group"> 
    <div class="editor-label"> 
     @Html.LabelFor(model => model.Assignment.StartDate) 
    </div> 
    <div class="editor-field"> 
     @Html.EditorFor(model => model.Assignment.StartDate) 
     @Html.ValidationMessageFor(model => model.Assignment.StartDate) 
    </div> 
</div> 

Как бы такое условное выражение выглядит? Нужно ли добавить что-то помимо условия в модели?

И, пожалуйста, скажите, если мое описание слишком скудное.

// Заранее спасибо, С уважением

+0

Посмотрите на это сообщение http://stackoverflow.com/questions/1406046/data-annotation-ranges-of-dates – Suni

ответ

0

Вы можете создать свою собственную проверку атрибута, как показано ниже:

1) Пользовательские проверки атрибутов с сообщением об ошибке

public class CheckInputDateAttribute : ValidationAttribute 
{ 
    protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
    { 
     var inputDate = (DateTime)value; 
     var compareDate = DateTime.Now.AddDays(21); 
     int result = DateTime.Compare(inputDate, compareDate); 
     const string sErrorMessage = "Input date must be no sooner than 3 weeks from today."; 
     if (result < 0) 
     { 
      return new ValidationResult(sErrorMessage); 
     } 
     return ValidationResult.Success; 
    } 
} 

Затем использовать его как

[DataType(DataType.Date)] 
    [CheckInputDate] 
    public DateTime StartDate { get; set; } 

2) Пользовательский атрибут проверки без пользовательского сообщения об ошибке

public class CheckInputDateAttribute : ValidationAttribute 
{ 
    public override bool IsValid(object value) 
    { 
     var inputDate = (DateTime)value; 
     var compareDate = DateTime.Now.AddDays(21); 
     int result = DateTime.Compare(inputDate, compareDate); 
     return result >= 0; 
    } 
} 

Затем использовать его как

[DataType(DataType.Date)] 
    [Display(Name = "Start date")] 
    [CheckInputDate] 
    public DateTime StartDate { get; set; } 
+0

Спасибо, я попробую. – user3147607

+0

Спасибо, это работает красиво. Однако, и я чувствую себя немного глупым, не понимая этого. Вместо отображения имени свойства и сообщения: «[Assignment.StartDate] = дата ввода должна быть не раньше, чем через 3 недели с сегодняшнего дня». Я хотел бы показать отображаемое имя и сообщение об ошибке. – user3147607

+0

hi @ user3147607, см. Мой обновленный ответ. – Lin

0

Вы можете сделать это в вашей модели. Добавьте правильные сообщения об ошибках.

[Required(ErrorMessage = "")] 

[Range(typeof(DateTime), DateTime.Now.ToString(), DateTime.Now.AddDays(21).ToString(), ErrorMessage = "")] 

public DateTime StartDate { get; set; } 
+1

Поправьте меня, если я ошибаюсь, но не приведет ли это к компиляционной ошибке: «Аргумент атрибута должен быть константным выражением, выражением типа или выражением для создания массива типа атрибута»? – LiquidPony

+0

Я попробую это. Не могу попробовать до завтра, хотя. Вопрос, похоже, что это должно быть между сегодняшним и тремя неделями вперед, я не прав? – user3147607

Смежные вопросы