.Net - DataAnnotations - Проверка 2 зависимых DateTime - PullRequest
1 голос
/ 19 января 2010

Допустим, я получил следующие классы:

public class Post 
{
    public Date BeginDate { get; set; }

    [Validate2Date(BeginDate, EndDate, ErrorMessage = "End date have to occurs after Begin Date")]
    public Date EndDate { get; set; }
}

public class Validate2Dates : ValidationAttribute
{
    public Validate2Dates(DateTime a, DateTime b)
    { ... }

    public override bool IsValid(object value)
    {
        // Compare date and return false if b < a
    }
}

Моя проблема в том, как использовать мой собственный атрибут Validate2Dates, потому что я не могу этого сделать:

[Validate2Date(BeginDate, EndDate, ErrorMessage = "End date have to occurs before Begin Date")]

Я получил следующую ошибку:

Ссылка на объект требуется для нестатического поля, метода или свойство '... Post.BeginDate.get' C: ... \ Post.cs

Ответы [ 2 ]

0 голосов
/ 23 декабря 2010

Ответ - да, вы можете делать то, что пытаетесь сделать, но не так, как вы это делаете в настоящее время.(Между прочим, я только что заметил, что на этот вопрос уже получен очень хороший ответ, поэтому я подумал, что по крайней мере опущу краткую ссылку на него.)

На основании ссылки выше.

  1. Вам нужно написать собственный валидатор (что вы уже сделали)
  2. Вам нужно будет украсить вашу модель в классе уровень, а не уровень свойства
  3. Вы не будете использовать сами свойства в качестве параметров - вместо этого вы просто будете ссылаться на них как на строки, которые нужно искать с помощью отражения

[Validate2Date(BeginDate, EndDate, ...

становится

[Validate2Date(StartDate = "BeginDate", EndDate = "EndDate", ...

Затем вы переопределяете IsValid () и размышляете над необходимыми свойствами для выполнения сравнения. Из ссылки

.... 
        var properties = TypeDescriptor.GetProperties(value);
        object originalValue = properties.Find(OriginalProperty, true /* ignoreCase */).GetValue(value);
        object confirmValue = properties.Find(ConfirmProperty, true /* ignoreCase */).GetValue(value);
        return Object.Equals(originalValue, confirmValue);
....
0 голосов
/ 19 января 2010

Вы не можете использовать такой атрибут.Параметры атрибута ограничены постоянными значениями.

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

...