Nenhum comentário Download


Validações no ASP.NET MVC

 

 

Mostramos anteriormente, em dois artigos, as características do ASP.NET MVC. Neste artigo, quero falar exclusivamente de validações, pois é uma das funcionalidades mais importantes para cadastros de aplicações Web.

 

Para que a sua aplicação funcione da melhor maneira possível, é necessário que os dados oriundos dos usuários sejam os mais corretos (falando em termos de integridade), assim temos a necessidade de validá-los antes de inserir no banco.

 

Mostrarei nesse artigo como validar no ASP.NET MVC, verificando os dados na Action e usando DataAnnotattions, uma facilidade onde indicamos no Model o que queremos validar.

Criando a aplicação

Vamos criar uma aplicação simples, para que possamos mostrar os exemplos de validações para serem usadas em aplicações Web com ASP.NET MVC. Crie um novo projeto ASP.NET MVC 4 Web Application (Figura 1).

 

 

Figura 1. Criando uma aplicação ASP.NET MVC

 

Vamos usar o template Basic no projeto. Com o projeto criado, vamos criar um modelo, conforme a Listagem 1.

 

Listagem 1. Criando o modelo

using System;

using System.ComponentModel.DataAnnotations;

 

namespace Validacoes.Models

{

    public class Pessoa

    {

        [Key]

        public int ID { get; set; }

        public string Nome { get; set; }

        public DateTime Nascimento { get; set; }

        public string Login { get; set; }

        public string Email { get; set; }

    }

}

 

Crie também o Context, como podemos ver na Listagem 2.

 

Listagem 2. Criando o contexto da aplicação

using System.Data.Entity;

using Validacoes.Models;

 

namespace Validacoes.Controllers

{

    public class Contexto: DbContext

    {

        public DbSet<Pessoa> Pessoas { get; set; }

    }

}

 

Vamos criar agora, o Controller (Figura 2).

 

 

Figura 2. Criando o controller da Pessoa

 

Nota: caso deseje pode usar a técnica de templates com scaffolding. Resolvi fazer manualmente para mostrar como seria sem a técnica.

 

Agora, vamos modificar o Controller (Listagem 3).

 

Listagem 3. Criando o controller

using System.Linq;

using System.Web.Mvc;

using Validacoes.Models;

 

namespace Validacoes.Controllers

{

    public class PessoaController : Controller

    {

        private Contexto db = new Contexto();

 

        public ActionResult Index()

        {

            return View(db.Pessoas.ToList());

        }

 

  public ActionResult Create()

        {

            return View();

        }

 

        [HttpPost]

        public ActionResult Create(Pessoa pessoa)

        {

            if (ModelState.IsValid)

            {

                db.Pessoas.Add(pessoa);

                db.SaveChanges();

                return RedirectToAction("Index");

            }

 

            return View(pessoa);

        }

    }

}

 

Por enquanto, temos apenas dois métodos. Um que retorna uma lista com os registros (Index) e outro que insere os registros (Create).

Validando na Action

No ASP.NET MVC não temos os controles Validators, como no ASP.NET Web Forms. Assim, podemos criar a validação na Action que cadastra o registro. Veja na Listagem 4, como podemos fazer a validação no Create.

 

Listagem 4. Validando na action

[HttpPost]

public ActionResult Create(Pessoa pessoa)

{

   if (string.IsNullOrEmpty(pessoa.Nome))

      ModelState.AddModelError("Nome", "Campo Nome: preenchimento obrigatório.");

 

   if (string.IsNullOrEmpty(pessoa.Login))

      ModelState.AddModelError("Login", "Campo Login: preenchimento obrigatório.");

 

   if (string.IsNullOrEmpty(pessoa.Email))

      ModelState.AddModelError("Email", "Campo Email: preenchimento obrigatório.");

           

   if ((DateTime.Now.Year - pessoa.Nascimento.Date.Year) < 18)

      ModelState.AddModelError("Nascimento", "Campo Nascimento: A idade deve ser maior que 18 anos.");

           

   if (ModelState.IsValid)

   {

      db.Pessoas.Add(pessoa);

      db.SaveChanges();

      return RedirectToAction("Index");

   }

 

      return View(pessoa);

}

 

A validação é bem simples, pois verificamos se o campo tem valores e adicionamos em ModelState.AddModelError, o nome do campo (parâmetro pede uma chave) e a respectiva mensagem de erro. Fizemos uma validação para que o cadastro aceite apenas Pessoas maiores de 18 anos.

 

Vamos criar a View que vai usar a Action do cadastro. Veja na Listagem 5, a View do cadastro de Pessoa.

 

Listagem 5. View de cadastro de Pessoa

@model Validacoes.Models.Pessoa

 

@{

    ViewBag.Title = "Create";

}

 

<h2>Create</h2>

 

@using (Html.BeginForm()) {

    @Html.ValidationSummary(true)

 

    <fieldset>

        <legend>Pessoa</legend>

 

        <div class="editor-label">

            @Html.LabelFor(model => model.Nome)

        </div>

        <div class="editor-field">

            @Html.EditorFor(model => model.Nome)

            @Html.ValidationMessageFor(model => model.Nome)

        </div>

 

        <div class="editor-label">

            @Html.LabelFor(model => model.Nascimento)

        </div>

        <div class="editor-field">

            @Html.TextBoxFor(model => model.Nascimento)

            @Html.ValidationMessageFor(model => model.Nascimento)

        </div>

 

        <div class="editor-label">

            @Html.LabelFor(model => model.Login)

        </div>

        <div class="editor-field">

            @Html.EditorFor(model => model.Login)

            @Html.ValidationMessageFor(model => model.Login)

        </div>

 

        <div class="editor-label">

            @Html.LabelFor(model => model.Email)

        </div>

        <div class="editor-field">

            @Html.EditorFor(model => model.Email)

            @Html.ValidationMessageFor(model => model.Email)

        </div>

 

        <p>

            <input type="submit" value="Salvar" />

        </p>

    </fieldset>

}

 

<div>

    @Html.ActionLink("Lista", "Index")

</div>

 

O “segredo” para apresentar as mensagens, é usar o ValidationSumary e ValidationMessageFor. Caso não usassemos o ValidationMessageFor, a mensagem não é apresentada, somente o campo fica com a cor em vermelho. Rode a aplicação e veja na Figura 3 o resultado.

 

Nota: Precisamos criar um Controller Home para chamar a tela de cadastro.

 

 

Figura 3. Validando o cadastro de Pessoa

 

Validando com DataAnnotattion

A validação anterior funciona, mas imagine uma quantidade grande de campos no cadastro, o trabalho é oneroso, sem falar que precisamos adicionar nessa Action mais validações, se mais campos forem incluídos no modelo.

 

Uma maneira fácil de validar, é usando DataAnotattion no modelo. Temos que apenas “marcar” cada propriedade do modelo. Essa marcação indica se o campo é obrigatório, quantidade de caracteres permitidos, uso de expressões regulares etc.

 

Veja na Listagem 6 como fica o modelo com DataAnnotattion.

 

Listagem 6. Marcando o modelo com DataAnnotation

[Required(ErrorMessage="Campo Nome: preenchimento obrigatório.")]

[StringLength(35, ErrorMessage="Campo Nome: aceita no máximo 35 caracteres.")]

public string Nome { get; set; }

 

[Remote("ValidaIdade", "Pessoa",

  ErrorMessage = "Campo Nascimento: A idade deve ser maior que 18 anos.")]

public DateTime Nascimento { get; set; }

 

[Required(ErrorMessage = "Campo Login: preenchimento obrigatório.")]

[StringLength(15, ErrorMessage = "Campo Login: aceita no máximo 15 caracteres.")]

public string Login { get; set; }

 

[Required(ErrorMessage = "Campo Email: preenchimento obrigatório.")]

[RegularExpression(@"^[A-Za-z0-9](([_\.\-]?[a-zA-Z0-9]+)*)@([A-Za-z0-9]+)(([\.\-]?[a-zA-Z0-9]+)*)\.([A-Za-z]{2,})$",

  ErrorMessage = "Campo Email: valor inválido.")]

[EmailAddress(ErrorMessage="Campo Email: valor inválido.")]

public string Email { get; set; }

 

Vamos explicar qual a característica de cada um. O Required indica que o campo é obrigatório e um dos seus parâmetros é a mensagem de erro (assim como temos nos outros).

StringLength permite que possamos definir um tamanho para a string, assim indicamos no parâmetro o tamanho e no outro a mensagem.

 

Em RegularExpression podemos indicar uma expressão regular. Nesse caso, é para validar o e-mail (código retirado da internet). Também podemos validar o e-mail com o EmailAddress, mas ele esta presente somente na versão 4.5 do .NET Framework. Lembre-se disso.

 

Por fim, o Remote, possibilita que possamos usar um método para validar o campo. Assim, indicamos o método, o controller e a mensagem de erro. Muito eficiente para validações que precisamos pesquisar no banco para verificar se o campo é único, por exemplo, como o login.

 

No exemplo, vamos apenas validar se a data informada é maior que 18 anos, semelhante ao feito anteriormente. Veja na Listagem 7 o código do método no PessoaController.

 

Listagem 7. Validando o campo Nascimento com método no Controller

[AllowAnonymous]

public JsonResult ValidaIdade(DateTime Nascimento)

{

   var result = (DateTime.Now.Year - Nascimento.Date.Year) > 18;

   return Json(result, JsonRequestBehavior.AllowGet);

}

 

Note que o retorno do método é um JsonResult. Dentro do método, verificamos se a idade é maior que 18 e retornamos o Json, com o parâmetro da validação. Na View precisamos adicionar a biblioteca de validação do jQuery.

 

Adicione no final do arquivo o seguinte código:

 

@section Scripts {

    @Scripts.Render("~/bundles/jqueryval")

}

 

Execute a aplicação e tente salvar uma data de nascimento que o valor da idade seja menor que 18 (Figura 4).

 

 

Figura 4. Validando no servidor a idade da Pessoa

 

Note que é essencial o uso da biblioteca do jQuery para que a validação funcione corretamente. A facilidade de DataAnnotattions proporciona o desenvolvimento de modelos robustos e fáceis de serem modificados (manutenção).

Conclusões

Vimos neste artigo como trabalhar com validações em aplicações ASP.NET MVC. Podemos notar que a quantidade de possibilidades é grande, deixando a cargo do desenvolvedor, escolher a que mais se adapta a sua aplicação.

 

Validações de dados em ambiente Web são muito importantes, pois não da margem para mal intencionados acessariam sua aplicação. Já trabalhei em projetos que era solicitado que se fizesse validação no cliente e no servidor, então, caso seja a sua necessidade, vimos nesse artigo as duas possibilidades em aplicações ASP.NET MVC.

 

Um grande abraço a todos e até a próxima!