none
DataAnnotation: Como validar propriedade "e-mail", verificar se existe ou não no banco, com atributo sem ser no cliente e sim no Servidor RRS feed

  • Pergunta

  • Ola Pessoal!

    Eu tenho uma aplicação em camadas, e na minha camada de apresentação, tenho uma ViewModel que é
    "UsuarioViewModel" dentro desta tenho um property chamada "public email {get; set;}".

    Ja esta validando atraves de DataAnnotation tudo corretamente, eu si preciso soluciona uma questão, como eu valido, sem ser no cliente em sim no servidor, se o email que esta sendo cadastrado ja existe no meu banco de dados!.

    Ja tentei fazer um atributo de validação customizado mas sem sucesso, minha simples questão é : Como eu valido no servidor e mando a mensagem de "Email já cadastrado" do mesmo jeito que ja existe os atributos [Required, Min, Max, Date, CreditCard], entendem.

    Só uma observação: Talvez vocês se pergunte por que não faz a validação por "Microsoft jQuery Unobtrusive", minha resposta é: Pode ter usuários que desabilitem a execução de comandos Java Script no browser entendem, é por isso.

    Visto que quando o usuário preenche o campo email no form o controller vai dar como "True" na minha linha "ModedelState.IsValid", eai como eu valido neste caso ?

    Classe UsuarioViewModel

        public class UsuarioViewModel : BaseModel
        {
            [DisplayName("Código")]
            public override int id { get; set; }

            [DisplayName("Nome")]
            [Required(ErrorMessage = "Informe seu o nome completo")]
            public string nomeCompleto { get; set; }

            [DisplayName("Login")]
            [Required(ErrorMessage = "Informe o login")]
            [MinLength(7, ErrorMessage = "O login deve ter 8 ou mais caracteres")]
            public string login { get; set; }

            [DisplayName("Senha")]
            [Required(ErrorMessage = "Informe a senha")]
            [MinLength(7, ErrorMessage = "A senha deve ter 8 ou mais caracteres")]
            public string senha { get; set; }

            [DisplayName("Email")]               
            [Required(ErrorMessage = "Informe o email")]
            [RegularExpression(@"^(([A-Za-z0-9]+_+)|([A-Za-z0-9]+\-+)|([A-Za-z0-9]+\.+)|([A-Za-z0-9]+\++))*[A-Za-z0-9]+@((\w+\-+)|(\w+\.))*\w{1,63}\.[a-zA-Z]{2,6}$", ErrorMessage = "Informe um email válido")]
            public string email { get; set; }

            [DisplayName("Chave de Criptgrafia")]
            [Required(ErrorMessage = "Informe uma palavra ou frase pquena para chave criptografia")]
            public string chaveSimetrica { get; set; }

            [DisplayName("Data de Cadastro")]
            [Required(ErrorMessage = "Informe a data de cadastro")]        
            [DataType(DataType.DateTime)]
            [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd/MM/yyyy}")]
            public DateTime dataCriacao { get; set; }

            [DisplayName("Status")]
            [Required(ErrorMessage = "Informe o status")]
            public string status { get; set; }

        }

     UsuarioController

            [System.Web.Mvc.HttpPost]
            public ActionResult AdicionaUsuario([Bind(Exclude = "id")] UsuarioViewModel usuarioViewModel)
            {
                if (!ModelState.IsValid) return View();            

                Usuario usuario = new Usuario();
                SetModel(usuario, usuarioViewModel);
                _usuarioService.adicionaUsuario(usuario);

                return RedirectToAction("ListaUsuario");
            }

            [System.Web.Mvc.HttpPost]
            public ActionResult EditaUsuario(UsuarioViewModel usuarioViewModel)
            {
                if (!ModelState.IsValid) return View();

                Usuario usuario = new Usuario();
                SetModel(usuario, usuarioViewModel);
                _usuarioService.editaUsuario(usuario);

                return RedirectToAction("ListaUsuario");
            }



    domingo, 4 de janeiro de 2015 19:11

Respostas

  • Antonio.

    Dentro das Actions que fazem o POST, inclua antes da checagem !ModelState.IsValid algo como:

    if (EmailJaExistente(usuarioViewModel))
    {
        ModelState.AddModelError("email", "E-mail já cadastrado na base");
    }

    Espero ter ajudado!

    sexta-feira, 16 de janeiro de 2015 12:55

Todas as Respostas

  • Antonio.

    Dentro das Actions que fazem o POST, inclua antes da checagem !ModelState.IsValid algo como:

    if (EmailJaExistente(usuarioViewModel))
    {
        ModelState.AddModelError("email", "E-mail já cadastrado na base");
    }

    Espero ter ajudado!

    sexta-feira, 16 de janeiro de 2015 12:55
  • Pode fazer como o Renato falou ou criar um custom data annotation que chama seu DbContext e faz a verificação no banco, dá certo também.
    segunda-feira, 19 de janeiro de 2015 12:32