XVAL, DataNotações em toda a classe
-
20-09-2019 - |
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
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.