t

Comentários recentes

ASP.NET MVC 2 DataAnnotations - Parte 3

Postado por Daniel Fonseca Castro - Sunday, February 21, 2010 9:52 AM

Discutimos os atributos mais utilizados em uma aplicação e como criar um Validation customizado em outros posts, neste vamos ver como trabalhar com EF ou L2Q, para montar esse exemplo vou utilizar o EF.

A versão atual do EF não oferece suporte a POCO todo código de mapeamento do modelo físico para o conceitual é feito via desing sem a necessidade de escreve uma linha de código, isso na minha opinião é muito bom, mais esse beneficio é um problema para os DataAnnotations , isso porque toda vez que você atualiza o seu modelo via desing todo o código é recriado, e se você decorar as propriedades direto no código gerado pela ferramenta você perderá tudo na próxima atualização.Veja o aviso nas primeiras linhas do código gerado.

//------------------------------------------------------------------------------
// 
//     This code was generated by a tool.
//     Runtime Version:2.0.50727.4927
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// 
//------------------------------------------------------------------------------

Resumindo você não deve colocar nenhum código ai a não ser que você queira retrabalho, então como resolve esse problema?

Para resolve esse problema existe uma técnica chamada "buddy classes" , você basicamente precisa criar uma classe separada que contenha todas as propriedades que você quer validar e decorar as propriedades com os atributos necessários, o segundo passo é "ligar" essa classe com a classe gerada pelo EF, para isso você deve criar uma partial class da classe gerada pelo EF e decorar essa classe com o atributo MetadataType apontando para sua "buddy classes". Vamos ver como isso tudo funciona com um exemplo.

Vou começar o exemplo definindo um model, defini um banco de dados simples para armazenar informações de evento e a partir desse banco gerei EDMX. Veja as definições nas imagens abaixo.


Imagem 1 - Banco de dados.

Imagem 2 - Entity Framework.

Vamos agora adicionar as validações na entidade Evento para isso adicione uma classe que será nossa “buddy classes” , veja a definição da classe abaixo.

[MetadataType(typeof(EventoValidation))]
public partial class Evento
{
}

public class EventoValidation
{
    [Required(ErrorMessage = "O campo Nome é obrigatório.")]
    public string Nome { get; set; }

    [Required(ErrorMessage = "O campo Site é obrigatório.")]
    [RegularExpression(@"http(s)?://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?", ErrorMessage = "URL inválida.")]
    public string Site { get; set; }

    [Required(ErrorMessage = "O campo Local é obrigatório.")]
    public string Local { get; set; }

    [Required(ErrorMessage = "O campo Data é obrigatório.")]
    public DateTime Data { get; set; }

    [Required(ErrorMessage = "O campo Valor é obrigatório.")]
    [Range(0, 9999, ErrorMessage = "Valor do evento inválido.")]
    public decimal Valor { get; set; }
}

Na classe EventoValidation adicione todas as validações necessárias, como você já deve ter percebido as propriedades precisam ter o mesmo nome e tipo das propriedades gerada pelo EF, e por fim a partial class Evento foi decorada com o atributo MetadataType que “liga” a classe EventoValidation a classe gerada pelo EF.

Para finalizar o exemplo e verificar se tudo esta funcionando perfeitamente precisamos de um Controller e duas Views, veja abaixo a definição do controller Evento.

public class EventoController : Controller
{
    EventoRepositorio eventoRepositorio = new EventoRepositorio();
    //
    // GET: /Evento/

    public ActionResult Index()
    {
        return View(eventoRepositorio.ObterTodos());
    }

    public ActionResult Create()
    {
        return View(new Evento());
    }

    [HttpPost]
    public ActionResult Create(Evento evento)
    {
        if (ModelState.IsValid)
        {
            eventoRepositorio.Inserir(evento);
            return RedirectToAction("Index");
        }

        return View();
    }
}

O código acima não tem nenhuma novidade falta apenas definir o repositório, veja abaixo.

public class EventoRepositorio
{
    DatabaseEntities context = new DatabaseEntities();

    public void Inserir(Evento evento)
    {
        context.AddToEvento(evento);
        context.SaveChanges();
    }

    public IEnumerable<evento> ObterTodos()
    {
        return context.Evento.AsEnumerable();
    }
}

Para criar as Views clique com direto nas actions Index e Create, selecione Add View e configure-as conforme as imagens abaixo.


Imagem 3 - Configurações da view Index.

Imagem 4 - Configurações da view Create.

Agora você pode executar a aplicação, para finalizar falta apenas as validações no client para habilitá-las adicione as três linhas abaixo na view Create.


Um pouco trabalhoso o que você achou?

Esse exemplo também é valido para quem utiliza L2Q, baixe o exemplo em C# ou VB.NET.

Daniel Fonseca Castro

Currently rated 5.0 by 2 people

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Categories: ASP.NET MVC 2

Related posts

  • Antonio Gomes de Castro Jr
    Antonio Gomes de Castro Jr
    26 Apr 2010 9:02 AM
    Daniel,

    Parabéns pelos posts sobre DataAnnotations. Só como sugestão, a Parte 4 poderia ser uma validação do tipo "Email já existe no cadastro".
    Entendo que esse tipo de validação só vai ocorrer no servidor. O que aconteceria se eu decorasse a propriedade Email da minha entidade com um CustomValidatorAttribute e utilizasse o <%Htm.EnableClientValidation(); %> ?

    []s
  • Daniel Fonseca Castro
    Daniel Fonseca Castro
    26 Apr 2010 8:37 PM
    Olá Antonio,

    O <%Htm.EnableClientValidation(); %> não funciona para custom validation!
    Neste caso você teria que fazer as validações no client.

    Abraços,
    Daniel Fonseca Castro

Add comment


 

  Country flag