Validação de dados no ASP.NET MVC 3

Todos sabem que validação de dados é algo primordial em nossas aplicações pois garantem consistência dos dados. Devemos sempre ter cuidado com a entrada de dados, verificando o preenchimento obrigatório e a formatação dos campos e aplicando regras de negócio sempre que preciso.

Nest post farei uma introdução sobre validação no ASP.NET MVC 3.

———————
Nota: foi lançada no último dia 13/01 a versão final do ASP.NET MVC 3 (download aqui) e “pra comemorar” vou utilizar neste post sua nova view engine “Razor”. Não entrarei em detalhes do Razor para não fugir do foco. Não se preocupem, não irá influenciar em nada.
———————

Vou usar como exemplo um formulário básico de inscrição em um website, com apenas 2 campos: Nome e E-mail. A proposta é fazê-los obrigatórios e validar o formato do campo E-mail.

Vamos no passo-a-passo:

1) Criamos uma classe Pessoa representando o usuário cadastrado. Esta classe é o nosso modelo (o M do MVC) que será exibido pela View (o V do MVC). Por simplicidade, salve-a na pasta Models de sua aplicação MVC.

public class Pessoa
{
    [Required(ErrorMessage="Nome deve ser preenchido")]
    public string Nome { get; set; }

    [Required(ErrorMessage="E-mail deve ser preenchido")]
    [RegularExpression(@"\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*", ErrorMessage = "E-mail em formato inválido")]
    public string Email { get; set; }
}

Note que as propriedades “Nome” e “Email” estão decoradas com atributos chamados de Data Annotations, os quais definem as regras de validação que queremos utilizar. “Nome” e “Email” estão com o atributo “Required” porque ambos são obrigatórios. Para o “Email” colocamos o atributo “RegularExpression” pois também queremos validar o formato do mesmo.

2) Agora criamos nosso controller (o C do MVC) que será responsável pela inscrição do visitante no site. Por enquanto, deixamos ele “crú”. Logo voltaremos nele.

public class InscricaoController : Controller
{
    public ActionResult Index()
    {
        return View();
    }
}

3) Vamos agora criar a View que exibirá nosso formulário de inscrição. Clique com o botão direito dentro da action Index do controller (o método mostrado no item 2) e vá em “Add View…”. A janela “Add View” abrirá (como na figura abaixo).

Add View

Marque a opção “Create strongly-typed view” e no dropdown “Model class” selecione a classe Pessoa. Caso a mesma não esteja aparecendo, compile a aplicação e reabra a janela. Deixe o restante como na figura e clique em “Add” para criar a view. Feito isso (e alguns poucos ajustes no html), sua view deverá se parecer com isso:

View-Index

Observe no código da view o uso de 2 Helpers para a validação: Html.ValidationSummary e Html.ValidationMessageFor.

O ValidationSummary exibe uma lista de todos os erros contido no ModelState, objeto que armazena informações sobre o modelo durante a requisição corrente (valores informados e detalhes de erros). Já o ValidationMessageFor permite que você exiba a mensagem de erro de um campo específico em qualquer lugar da view, podendo inclusive especificar a mensagem de erro (sobrepondo aquela definida no DataAnnotation).

4) Rode a aplicação e acesse o endereço /inscricao para ser direcionado à view Index. Clique no botão “Inscrever-me agora!!” sem preencher nenhum dos campos e observe que a validação entra em ação como na figura abaixo.

Validacao Em Acao NaViewExperimente preencher um campo ou outro e coloque um formato inválido de e-mail para verificar que a validação exibe (ou oculta) as mensagens.

Perceba que o ValidationSummary não exibiu as mensagens de erro acima dos campos. Por que? Note que o ValidationSummary recebe como parâmetro o valor “true”.  Isto o instrui a ignorar as mensagens de erro de propriedades (property-level errors), que são os erros que possuem como chave o nome da propriedade a que se referem. Vamos entender melhor isso mais adiante.

Outro detalhe a observar é que a validação client-side vem habilitada por padrão no MVC 3. No MVC 2, precisávamos habilitá-la com o helper Html.EnableClientValidation. Além disso, podemos ver pelos scripts inseridos na view, que a validação padrão no MVC 3 é a validação do JQuery.

5) Muito bem! Terminamos? Ainda não. Hora de vermos a validação server-side. Ela é importante caso o usuário “burle” a validação em javascript, além de necessária para validarmos regras de negócio.

Notem no código da View que informamos em Html.BeginForm que o formulário será postado para a action FazerInscricao do controller Inscricao. Sendo assim, vamos voltar a este controller e implementar a action. O código completo do controller ficará como abaixo:


public class InscricaoController : Controller
{
    public ActionResult Index()
    {
        return View();
    }

    [HttpPost]
    public ActionResult FazerInscricao(Pessoa pessoa)
    {
        // validacao server-side
        // registrando manualmente um erro no ModelState
        if (pessoa.Nome.ToUpper() == "JOAO")
            ModelState.AddModelError("", "Você não pode se inscrever!");

        // verifica se ha algum erro registrado no ModelState
        // se nao ha, exibe view com mensagem de sucesso
        if (ModelState.IsValid)
            return View("InscricaoConcluida");

        // ocorreram erros - exibe a Index para usuario corrigir os erros
        return View("Index");
    }
}

Na action FazerInscricao, acrescentei uma regra: não pode ser feita a inscrição se informarem o nome  “JOAO” (sem acentuação). Tudo bem, é uma regra “idiota”, mas serve apenas para demonstrarmos a validação server-side. Qual a ideia? Se uma regra não é atendida, adicionamos o erro no ModelState usando o método AddModelError. Note que o primeiro parâmetro (a chave do erro) foi intencionalmente deixado em branco para indicarmos que este é um erro “model-level”. Isto o diferencia dos erros “property-level”, então somente ele será exibido quando o ValidationSummary receber “true” como parâmetro.

Logo após todas as validações serem feitas, devemos chamar ModelState.IsValid para garantir que não há nenhum erro. Na verdade, mesmo que não houvesse a validação do nome, deveríamos chamar ModelState.IsValid pois a validação client-side pode ser burlada.

Por fim, se está tudo ok renderizamos a view InscricaoConcluida, caso contrário renderizamos a mesma view (da inscrição) para exibirmos os erros.

(obs.: a view InscricaoConcluida contém apenas uma mensagem de sucesso, por isso nem falarei sobre ela)

6) Rode novamente a aplicação. Vá até a view e informe o nome “joao” e um e-mail válido e clique no botão. Veja que a validação server-side foi feita e a mensagem de erro é exibida corretamente no ValidationSummary:

Legal né? Preencha um nome diferente de “Joao” e você será redirecionado para InscricaoConcluida.

Com isso, vimos como é simples trabalhar com validação (client e server-side) no ASP.NET MVC 3.

6 comentários em “Validação de dados no ASP.NET MVC 3

Adicione o seu

  1. Parabéns pelo post, Robson!
    Me ajudou muito, gostaria de saber se tem como fazer essa validação que usou para o e-mail em CNPJ, telefone, valor em dinheiro e CEP??

    Sei que o post já é bem antigo, mas se alguém me ajudasse seria muito útil! 🙂

    Curtir

    1. Olá, Hestefani!
      Obrigado e desculpe pela demora. Tô corrido!!
      Provavelmente, você já deve até ter resolvido o problema né? 🙂
      É possível fazer sim de forma semelhante ao que mostrei com o e-mail, mas tenho trabalhado um pouco diferente atualmente, menos com annotations e mais com javascript/jquery.
      Qualquer coisa, entre em contato. Terei prazer em ajudar.
      []s

      Curtir

Participe! Vamos trocar uma ideia sobre desenvolvimento de software!

Blog no WordPress.com.

Acima ↑