Вопрос

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

Учитывая следующий класс:

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, но он никогда не вызывается в моем окне проверки?

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

Спасибо,

Хэл

Это было полезно?

Решение

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

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

ModelBinders.Binders.DefaultBinder = new DataAnnotationsModelBinder();

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top