A framework .NET disponibiliza através do namespace Sys-tem.ComponentModel.DataAnnotations vários atributos de validação que podem ser em modelos de classes do Entity Framework e Linq To SQL.
Adicionando esses atributos de validação nosmodels(modelos) da nossa aplica-ção, o MVC fará essa validação de forma transparente, sem necessidade de codifica-ção adicional por parte do programador para a validacodifica-ção básicas sobre omodel.
Anteriormente, utilizamos o modelodatabase firstpara gerar osmodelsda nossa aplicação, ou seja, osmodelssão automaticamente gerados, baseado na estrutura do banco de dados . Uma boa prática é não colocar os atributos de validação direta-mente nas classes geradas automaticadireta-mente pelo Visual Studio. Isso porque sempre que o modelo do Entity Framework for atualizado com base no banco de dados,
4.7. Adicionando atributos de validação nos modelos Casa do Código
as classes serão recriadas, e com isso qualquer modificação feita anteriormente será perdida.
Seguindo essa boa prática, não iremos adicionar diretamente na classe gerada pelo Visual Studio os atributos de validação. Criaremos uma classe de metadados contendo as validações e, utilizando o recursoPartial ClassouClasses Parciais, va-mos vincular a classe de metadado com a classe criada automaticamente.
Classes Parciais
Dentre vários recursos disponibilizados pela plataforma .NET, encon-tramos as Partial Class ou Classes Parciais. Graças às classes parciais po-demos dividir a definição de uma classe em vários arquivos físicos. A keyword partialdeverá ser utilizada na definição da classe para “di-zer” que a classe é parcial.
Todas as classes geradas automaticamente utilizando Entity Fra-mework recebem a keywordpartialna sua definição. Devido a esse re-curso conseguimos estender essas classes sem alterar o arquivo físico que é passível de modificação pelo Entity Framework.
Para criar as validações referentes ao model Médico, clique com o botão di-reito do mouse na pasta Models da Solution Explorer e clique em Add. Na ja-nela que será apresentada selecione o tipoClass, e defina o nome da classe igual a MedicoMetadado. A figura4.15representa esse processo.
72
Figura 4.15: Adicionando a classe de metadado para o model Medico
Após a criação, o arquivo será aberto automaticamente pelo Visual Studio. A listagem10representa o código que deverá ser adicionado na classe MedicoMeta-dado.cs.
Repare que o arquivo MedicoMetadado.cs possui a definição das classes MedicoMetadadoe a classe parcial Medico.
Na classe parcial Medicoutilizamos o atributoMetadataType para informar qual o tipo da classe que possui os metadados que serão utilizados, e é com esses atributos que informamos que a classeMedicoMetadadodeverá ser utilizada.
A classe MedicoMetadadopossui as mesmas propriedades da classe Medico, afinal é nela que colocaremos as validações das propriedades. Em cada propriedade, utilizamos os atributos necessários para fazer a validação que desejamos.
Em todos os exemplos estamos utilizando só dois atributos, o atributo Requireddefine que aquela propriedade é obrigatória, e já definimos nele a men-sagem de erro que será apresentada caso a propriedade não esteja informada. Além da validação de campo obrigatório, podemos utilizar o atributo StringLenght para validar o tamanho dos textos informados, e caso o tamanho ultrapasse o limite informado, definimos também a mensagem de erro que será apresentada.
Listagem 4.10- Definição dos Metadados do model Medico:
namespace CadeMeuMedico.Models {
4.7. Adicionando atributos de validação nos modelos Casa do Código
[StringLength(30, ErrorMessage="O CRM deve possuir no máximo 30 caracteres")]
public string CRM { get; set; }
[Required(ErrorMessage = "Obrigatório informar o Nome")]
[StringLength(80, ErrorMessage = "O Nome deve possuir no máximo 80 caracteres")]
public string Nome { get; set; }
[Required(ErrorMessage = "Obrigatório informar o Endereço")]
[StringLength(100, ErrorMessage = "O Endereço deve possuir no máximo 100 caracteres")]
public string Endereco { get; set; }
[Required(ErrorMessage = "Obrigatório informar o Bairro")]
[StringLength(60, ErrorMessage = "O Bairro deve possuir no máximo 60 caracteres")]
public string Bairro { get; set; }
[Required(ErrorMessage = "Obrigatório informar o E-mail")]
[StringLength(100, ErrorMessage = "O E-mail deve possuir no máximo 100 caracteres")]
public string Email { get; set; }
[Required(ErrorMessage = "Obrigatório informar se Atende por Convênio")]
public bool AtendePorConvenio { get; set; }
[Required(ErrorMessage = "Obrigatório informar se Tem Clínica")]
public bool TemClinica { get; set; }
[StringLength(80, ErrorMessage = "O Website deve possuir no
74
máximo 80 caracteres")]
public string WebsiteBlog { get; set; }
[Required(ErrorMessage = "Obrigatório informar a Cidade")]
public int IDCidade { get; set; }
[Required(ErrorMessage = "Obrigatório informar a Especialidade")]
public int IDEspecialidade { get; set; } }
}
Vimos até aqui as possíveis formas de criação dos modelos da aplicação, além de adicionar atributos de validação as propriedades do modelo. Mas nossa aplicação não possui só omodelMedico — ainda temos Usuários, Cidades e Especialidades.
Repita o processo apresentado e faça as classes de metadados referente a cada modelo da aplicação.
Lembre-se que, caso seja necessário, os códigos fontes completos da aplicação estão no github:
http://bit.ly/mvc-livrocodigofonte
Mas é um excelente exercício você mesmo criar todas as entidades.
Controllers: Adicionando
comportamento a nossa aplicação
O universo de desenvolvimento de software disponibiliza diferentes abordagens para a construção das aplicações (sobre o que já discutimos um pouco no primeiro capí-tulo deste livro). Tais abordagens podem variar em função de diversos aspectos, sendo os dois principais: o paradigma funcional da linguagem (orientada a obje-tos, funcional, procedural etc.) e as metodologias e ferramentas associadas para o trabalho conjunto com as linguagens e IDE’s.
Neste contexto, podemos concluir que, evidentemente, existem diferentes for-mas para que se possa implementar os comportamentos desejados para as aplicações.
Como você deve se lembrar, no modelo de programação proposto pelo ASP.NET Web Forms, por exemplo, tais comportamentos estavam diretamente ligados (via code-behind) a componentes de servidor que eram predefinidos pela Microsoft. Tal modelo é conhecido por muitos como “programação orientada a eventos” (herança de plataformas de desenvolvimento como Delphi, VB, dentre outras).