Как создать пользовательский валидатор, который проверяет, является ли одно из двух свойств datetime больше другого в asp.net mvc3 - PullRequest
0 голосов
/ 17 августа 2011

У меня есть этот класс с именем DateTimeViewModelNullable, где у меня есть метод, который возвращает DateTime?

public DateTime? GetDateTime
        {
            get
            {
                DateTime date;
                if (DateTime.TryParse(Date, CultureInfo.CurrentCulture, DateTimeStyles.None, out date))
                {
                    try
                    {
                        return new DateTime(date.Year, date.Month, date.Day, ParseInt(Hour), ParseInt(Minute), 0, DateTimeKind.Utc);
                    }
                    catch (ArgumentException)
                    {
                        return null;
                    }
                }
                return null;
            }
        }

У меня есть 2 свойства этого типа в модели представления. public DateTimeViewModelNullable DateOut {get; задавать; }

    [CustomIsValidDate(DateOut.GetDateTime,DateIn.GetDateTime,ErrorMessage = "Returning date must be higher than ingoing date!")]
    public DateTimeViewModelNullable DateIn { get; set; }

Мне нужно убедиться (и распечатать для пользователя), если начальная дата больше конечной, поэтому я создал customvalidator, но не работает

public class CustomIsValidDate : ValidationAttribute
{
    public DateTime? StartDate { get; set; }
    public DateTime? EndDate { get; set; }


    public CustomIsValidDate(DateTime? startDate, DateTime? endDate)
    {
        StartDate = startDate;
        EndDate = endDate;
    }

    public override bool IsValid(object value)
    {
        if (StartDate == null || EndDate == null)
            return true;
        if (EndDate > StartDate)
            return true;

        return false;
    }
}

Я получаю ошибку Ошибка Ссылка на объект требуется для нестатического поля, метода или свойства

Ответы [ 2 ]

0 голосов
/ 17 августа 2011

Просто использовать два datetime? Свойства вашей модели и реализуйте System.ComponentModel.DataAnnotations.IValidatableObject для этой модели, как показано ниже:

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

        if (From.HasValue && Until.HasValue)
        {
            if (From.Value.Date < Until.Value.Date)
                validations.Add(new ValidationResult("StartDateMustBeBeforeEndDate"));
            else if (From.Value.Date == From.Value.Date 
                        && From.Value.Hour < Until.Value.Hour)
                validations.Add(new ValidationResult("StartHourMustBeBeforeEndHour"));
            else if (From.Value.Date == From.Value.Date 
                        && From.Value.Hour == Until.Value.Hour 
                        && From.Value.Minute < Until.Value.Minute)
                validations.Add(new ValidationResult("StartMinuteMustBeBeforeEndMinute"));
        }

        return validations;
    }
0 голосов
/ 17 августа 2011

Вы используете статическую переменную в методе GetDateTime, вы должны удалить ее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...