Pergunta

Tenho uma validação completa em um obejeca e estou tentando descobrir a melhor maneira de lidar com isso.

Dada a seguinte aula:

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

Quero usar um DataNoTation e XVal para validar a classe antes de persistir, mas tenho uma validação complexa que requer mais de uma propriedade.

Pseudo:

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

Eu gostaria de anotar assim:

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

e ter uma regra de validação como esta:

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;
        }
    }

Espero que o parâmetro seja minha instância da classe LetterResponse, mas nunca é chamado no meu corredor de validação?

Alguém sabe uma maneira de lidar com isso?

Obrigado,

Hal

Foi útil?

Solução

Eu não acho que isso tenha a ver com o fato de você ter um validador de nível de classe. Para excluir qualquer conexão, tente aplicar um validador necessário para "Toname" e ver se o validador é chamado ou não.

Se estiver sendo chamado, informe -me, se não for, verifique se você substituiu seu Modelbinder padrão com o DataNoTationsModelBinder em seu arquivo global.asax.cs:

ModelBinders.Binders.DefaultBinder = new DataAnnotationsModelBinder();

Para mais detalhes sobre este projeto de demonstração e totalmente funcionando, leia isso Artigo do blog sobre validação do lado do cliente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top