xVal, DataAnnotations на весь класс - PullRequest
       18

xVal, DataAnnotations на весь класс

4 голосов
/ 28 августа 2009

У меня есть полная проверка объекта и я пытаюсь найти лучший способ справиться с ним.

Дан следующий класс:

public class LetterResponse {
 public Guid Id {get;set;}
 public bool SendBlankCart {get;set;}
 public string ToName {get;set;}
 public string ToAddress {get;set;}
}

Я хочу использовать dataannotation и xval для проверки класса перед сохранением его, но у меня сложная проверка, для которой требуется более одного свойства.

Псевдо:

if SendBlankCart {
 - no validation on ToName, ToAddress 
} else {
 ToName - required.
 ToAddress - required. 
}

Я хотел бы аннотировать так:

[LetterResponseValidator]
public class LetterResponse {
 public Guid Id {get;set;}
 public bool SendBlankCart {get;set;}
 public string ToName {get;set;}
 public string ToAddress {get;set;}
}

и иметь такое правило проверки:

public class LetterResponseValidator : ValidationAttribute
    {
        public override bool IsValid(object value)
        {
            if (value.GetType() == typeof(LetterResponse))
            {
                var letterResponse = (letterResponse) value;
                if (letterResponse.SendBlankCard)
                {
                    return true;
                } else
                {
                    if (string.IsNullOrEmpty(letterResponse.FromDisplayName) || string.IsNullOrEmpty(letterResponse.ToAddress1))
                    {
                        return false;
                    }
                    return true;
                }

            }
            return false;
        }
    }

Я ожидаю, что этот параметр будет моим экземпляром класса LetterResponse, но он никогда не вызывается в моем средстве проверки правильности?

Кто-нибудь знает способ справиться с этим?

Спасибо

Hal

1 Ответ

3 голосов
/ 28 августа 2009

Не думаю, что это связано с тем, что у вас есть валидатор на уровне класса. Чтобы исключить любое соединение, попробуйте применить фиктивный требуемый валидатор к «ToName» и посмотрите, вызывается ли валидатор или нет.

Если он вызывается, то дайте мне знать, если нет, то вам следует проверить, не переопределили ли вы ваше стандартное связыватель моделей с помощью DataAnnotationsModelBinder в вашем файле Global.asax.cs:

ModelBinders.Binders.DefaultBinder = new DataAnnotationsModelBinder();

Подробнее об этом и полностью работающем демонстрационном проекте читайте в статье блога о проверке на стороне клиента .

...