Neste segundo post vamos criar um Validation customizado, você pode fazer isso simplesmente estendendo as funcionalidades de um Validation existe ou estender da classe base ValidationAttribute, para esse exemplo vamos ficar com a segunda opção. Vamos criar um validador de CPF e CNPJ.
A classe ValidationAttribute possui o método abstrato IsValid e recebe como parâmetro um object com o valor a ser valido e retorna um booleano que indica se o valor é valido ou não, mais simples que isso impossível, veja a assinatura do método abaixo.
public abstract bool IsValid(object value)
Vamos ao trabalho veja o código completo do validador abaixo.
[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
public class CustomValidationAttribute : ValidationAttribute
{
public override bool IsValid(object value)
{
if (value == null) return false;
if (Documento == TipoDocumento.CNPJ)
return this.ValidarCNPJ(value.ToString());
else if (Documento == TipoDocumento.CPF)
return this.ValidarCPF(value.ToString());
return false;
}
public TipoDocumento Documento { get; set; }
public bool ValidarCNPJ(string cnpj)
{
//Código de validação do CNPJ
}
public bool ValidarCPF(string cpf)
{
//Código de validação do CPF
}
}
public enum TipoDocumento
{
CPF,
CNPJ
}
O código acima herda da classe ValidationAttribute e implementa o método abstrato IsValid, para definir o tipo de documento que será validado adicionei um enum "TipoDocumento", ocultei o código de validação de CPF e CNPJ para deixar o post mais "limpo" mais você pode baixar o fonte completo no final do post ou fazer uma pesquisa rápida na web.
Para testar o validador, vamos começar criando um Model, veja o código abaixo.
public class Cliente
{
[Required(ErrorMessage = "O campo Nome é obrigatório.")]
public string Nome { get; set; }
[Required(ErrorMessage = "O campo CPF é obrigatório.")]
[CustomValidation(ErrorMessage = "CPF inválido", Documento = TipoDocumento.CPF)]
public string CPF { get; set; }
[Required(ErrorMessage = "O campo CNPJ é obrigatório.")]
[CustomValidation(ErrorMessage = "CNPJ inválido", Documento = TipoDocumento.CNPJ)]
public string CNPJ { get; set; }
}
Note que a propriedade CPF e CNPJ utilizam o CustomValidation , agora só falta criar o Controller e a View, veja o código do Controller abaixo :
public class ClienteController : Controller
{
public ActionResult Index()
{
return RedirectToAction("Create");
}
public ActionResult Create()
{
return View(new Cliente());
}
[HttpPost]
public ActionResult Create(Cliente cliente)
{
if (ModelState.IsValid)
{
return this.Content("Model Valído!");
}
return View();
}
}
O código do Controller não tem nenhuma novidade, por fim clique com o direito dentro da Action "Create" selecione Add View e configure a View conforme a imagem abaixo.
Imagem 1 - Configurações da View
Pronto rode o projeto digite http://localhost:xxxx/cliente/Create e teste o validador a vontade veja na imagem abaixo o resultado esperado.
Imagem 2 - Resultado esperado
É isso ai simples e sem sofrimento! Note que para os validadores customizado não temos o suporte Client-Side por se tratar de uma validação customizada você terá que programar as suas validações JavaScript. No próximo post vamos ver como trabalhar com DataAnnotations e EF.
Código fonte em C# e VB.NET
Daniel Fonseca Castro