Escolar Documentos
Profissional Documentos
Cultura Documentos
Introducao ASPNET MVC4
Introducao ASPNET MVC4
Conceitos Bsicos....................................................................................................................... 22
Inicializao de Aplicaes MVC ............................................................................................................ 23
Pgina 2
Implementando UnitOfWork .............................................................................................................. 34 Codificando nosso HomeController ..................................................................................................... 34 A View Home.................................................................................................................................... 36 Finalizando a aplicao de exemplo .................................................................................................... 39
Pgina 3
Definio
MVC um modelo de design padro, utilizado por muitos desenvolvedores. Algumas aplicaes Web exploraro os novos recursos do MVC framework. Outras continuaro utilizando o modelo tradicional baseado em Web Forms e postbacks. Outras aplicaes combinaro as duas abordagens. Nenhuma das abordagens exclui a outra. O MVC framework inclui os seguintes componentes:
Models
O objeto Model a parte da aplicao que implementa a lgica para a camada de dados da aplicao. Frequentemente, o objeto Model responsvel por recuperar e persistir o estado do modelo no banco de dados. Por exemplo, um objeto Produto pode recuperar informaes do banco de dados, operar com estas informaes, e ento persistir a informao atualizada na tabela de Produtos no SQL Server. Em aplicaes pequenas, o objeto Model frequentemente separado conceitualmente e no fisicamente. Por exemplo, se a aplicao faz apenas a leitura de um conjunto de dados e os exibe utilizando um objeto View, a aplicao no ter necessariamente uma camada de dados fsica. Neste caso, o objeto Model representaria esta camada.
Pgina 4
Views
Views so componentes que exibem a interface de usurio (UI). Tipicamente, esta UI criada a partir do modelo de dados. Um exemplo seria um objeto View para editar a tabela de Produtos. Este objeto View exibe controles como caixas de texto (TextBox), caixas de listagem (DropDownList), e caixas de verificao (CheckBox) com dados que representam o estado atual do objeto Produto.
Controllers
Os objetos Controllers so componentes que gerenciam a interao do usurio, operam o objeto Model, e por ltimo selecionam um objeto View para exibir os dados na camada do usurio (UI). Numa aplicao MVC, o objeto View apenas exibe informaes, o objeto Controller gerencia e responde s entradas e interaes do usurio. Por exemplo, o Controller gerencia os valores passados atravs de query-string, e passa esses valores para o objeto Model, que por sua vez consulta o banco de dados utilizando os valores recebidos.
Benefcios
A arquitetura MVC facilita a separao das diferentes camadas da aplicao (lgica de entrada de dados, lgica de negcios e lgica de apresentao), alm de prover o conceito loose coupling entre esses componentes. Isto significa que cada componente tem ou usa, pouco ou nenhum conhecimento, sobre a implementao do outro. Esta arquitetura determina onde cada camada dever ser implementada na aplicao. A camada de apresentao (UI) pertence aos objetos View. A lgica para gerenciar a entrada de dados e interaes com o usurio pertence aos objetos Controller. As regras de negcio pertencem aos objetos Model. Esta separao auxilia a gerenenciar a complexidade durante a construo da aplicao, porque ela permite que voc se concentre na implementao de uma camada de cada vez. Por exemplo, voc pode focar na construo de um objeto View sem depender ou conhecer a implementao da lgica de negcios implementada no objeto Model. Alm de auxiliar no gerenciamento da complexidade durante o desenvolvimento da aplicao, o modelo MVC facilita o trabalho de testar sua implementao, tornando-o mais fcil se comparado ao modelo Web Forms. Por exemplo, numa aplicao ASP.NET baseada em Web Forms, uma nica classe utilizada para exibir os dados e gerenciar as interaes com o usurio. Escrever testes automatizados para uma aplicao ASP.NET baseada em Web Forms pode ser complexo, porque para testar uma pgina individualmente, voc precisa instanciar a classe da pgina testada, todos os controles e classes dependentes. Como muitas classes podem ser instanciadas para executar uma nica pgina, pode tornar-se difcil a tarefa de testar partes especficas da aplicao. Por isso testar uma aplicao ASP.NET baseada em Web Forms uma tarefa mais difcil do que testar uma aplicao baseada no modelo MVC. Alm disso, para testar uma aplicao ASP.NET baseada em Web Forms necessrio um Web Server. O framework MVC desconecta os componentes e faz uso de Interfaces, o que torna possvel testar componentes individualmente, isolados do resto do framework. A separao entre os principais componentes de uma aplicao MVC tambm promove o desenvolvimento paralelo (parallel development), onde um desenvolvedor pode trabalhar no objeto View, um segundo desenvolvedor pode trabalhar no objeto Controller enquanto um terceiro desenvolvedor se concentra nas regras de negcio implementadas no objeto Model.
Pgina 5
Pgina 6
Um poderoso componente de mapeamento de URL que permite que voc construa aplicaes que tenham URLs compreensveis e pesquisveis. URLs no precisam incluir nomes de arquivos e extenses, e so criadas para suportar modelos de nomenclatura de URLs que funcionam bem com os mecanismos de search engine optimization (SEO) e tambm com endereamento representational state transfer (REST). Suporte para utilizao de linguagem de marcao nas pginas ASP.NET (arquivos *.aspx), nos controles de usurio (arquivos *.ascx), nas master-pages (arquivos *.master) para criar modelos (templates) para objetos View. Voc pode utilizar recursos existentes do ASP.NET combinados com o MVC framework, como master-pages aninhadas, expresses in-line (<%= %>), controles server-based, data-binding, localizao, e outros. Suporte para recursos de segurana. A arquitetura ASP.NET MVC permite a utilizao dos modelos Forms Authentication, Windows Authentication, URL Authorization, Membership, Roles, Profiles, Caching, entre outros.
Pgina 7
Observe a seguir alguns exemplos das diferenas entre as sintaxes ASPX e Razor. ASPX:
Razor:
ASPX:
Razor:
Pgina 8
Pgina 9
Pgina 10
Pgina 11
Pgina 12
O mtodo InitializeDatabaseConnection
O objeto WebSecurity implementa o mtodo InitializeDataBaseConnection. Este mtodo requer cinco argumentos, descritos na Tabela 1. ConnectionString vlida que indica o servidor e banco de dados onde sero armazenadas as informaes de usurios e grupos. UserProfile String com nome da tabela que contm o perfil de usurios. UserID String com nome da coluna que contm o ID do usurio na tabela de perfil de usurios. UserName String com nome da coluna que contm o Username na tabela de perfil de usurios. autoCreateTables Boolean que determina se o mecanismo do SimpleMembershiProvider dever criar automaticamente as tabelas, caso elas no sejam encontradas no banco de dados especificado na string de conexo. Tabela 1: Agumentos do mtodo InitializeDatabaseConnection DefaultConnection
Este mtodo invocado no construtor da classe SimpleMembershipInitializer que parte da implementao do atributo InitializeSimpleMembershipAttribute. Consulte o arquivo de mesmo nome localizado na pasta Filter da sua soluo. Sempre que sua aplicao consumir um mtodo ou propriedade do objeto WebSecurity, certifique-se de que o atributo InitializeSimpleMembership foi devidamente invocado. Explicando melhor, se voc tem uma classe onde vrios mtodos interagem com o SimpleMembershipProvider, defina este atributo na declarao da classe. Este atributo no pode ser invocado mais de uma vez para a mesma classe, isto provocar uma exceo. Ao criar um novo projeto baseado no template ASP.NET MVC Application, o desenvolvedor no precisa preocupar-se com as referncias, assemblies e namespaces necessrios para implementar o mecanismo de autenticao e controle de acesso de usurios, o Visual Studio se encarrega desta tarefa. Observe a Figura 7. Ela apresenta o atributo InitializeSimpleMembership na declarao da classe AccountController onde a maioria dos mtodos interagem com o SimpleMembershiProvider.
Pgina 13
Pgina 14
A Figura 8 apresenta a janela Solution Explorer exibindo os arquivos gerados automaticamente para contemplar as funcionalidades do SimpleMembershipProvider.
Pgina 15
sobre o uso dos Data Annotation Classes Attributes, consulte http://msdn.microsoft.com/enus/library/dd901590%28v=vs.95%29.aspx. A Figura 9 ilustra alguns destes atributos.
Figura 9: Data Annotation Classes Attributes A maioria das strings utilizadas pelas Views do SimpleMembershipProvider baseiam-se no argumento Name do atributo [Display] para alimentar os labels dos controles apresentados em suas pginas e nas mensagens de erros dos atributos de validao. Por exemplo, o atributo Display, possui dois argumentos Name e Description. O primeiro, o texto que ser exibido ao lado do controle como se fosse um label do controle. A leitura deste atributo feita atravs dos mtodos LabelFor ou DisplayFor do objeto Html, usado largamente para a construo das Views. A sintaxe simples, veja o exemplo a seguir:
(na propriedade Address da classe Customer.cs) [Display(Name=Endereo, Description=Endereo/Logradouro do Cliente)] (Na View, CustomerView.cshtml) Html.DisplayFor(model => item.Address)
No exemplo acima, o label para o campo Address da CustomerView exibir o texto Endereo indicado pelo argumento Name do Atributo Display. Ao posicionar o cursor sobre este campo, um ToolTipText ser exibido contendo o texto do argumento Description do mesmo atributo.
Pgina 16
Retomando o ponto inicial deste tpico, para regionalizar as strings utilizadas nos labels e mensagens do mecanismo de autenticao do SimpleMembershipProvider, o desenvolvedor deve substituir estas strings por textos do idioma desejado. A Globalizao de strings para suporte a mltiplos idiomas no objeto de estudo deste tutorial. Para maiores informaes sobre a globalizao de aplicaes ASP.NET MVC consulte este exemplo http://afana.me/post/aspnet-mvc-internationalization.aspx.
Cadastrando um Usurio
A View Register.cshtml encontrada na pasta Views/Account oferece uma alternativa para cadastro de novos usurios. Contudo, o desenvolvedor poder criar outras views ou formulrios para esta finalidade. O Namespace WebMatrix.WebData implementa o objeto WebSecurity que expe o mtodo CreateUserAndAccount(string userName, string Password). Este mtodo cria um novo registro nas tabelas UserProfile e webpages_Membership. As senhas so criptografadas e persistidas na tabela webpages_Membership. A ao Register da classe AccountController apresenta um exemplo de utilizao do mtodo CreateUserAndAccount, abaixo um fragmento de cdigo extrado desta classe.
... WebSecurity.CreateUserAndAccount(model.UserName, model.Password); ...
Pgina 17
Mtodo AddUsersToRole
AddUsersToRoles
AddUserToRole
AddUserToRoles
Descrio Adiciona todos usurios informados no parmetro Users ao grupo informado no argumento roleName. Adiciona todos os usurios informados no parmetro Users todos os grupos informados no parmetro Roles. Adiciona o usurio informado no parmetro userName ao grupo informado no parmetro roleName Adiciona o usurio informado no parmetro userName todos os grupos informados no parmetro Roles.
Pgina 18
Uma vez no servidor, o atributo [ValidateAntiForgeryToken] garante que a ao ou mtodo ser executada apenas e somente aps a validao do token recebido. Observe o exemplo a seguir.
... [HttpPost] [ValidateAntiforgeryToken] public ActionResult Disassociate(string provider, string providerUserId) ...
Pgina 19
Figura 12: Os atributos [Authorize] e [AllowAnonymous] At agora estamos falando apenas de restringir ou permitir o acesso para usurios autenticados, no nos preocupamos com o perfil deste usurio, por exemplo, a que grupo ou grupos pertence, ou quem este usurio especificamente. Para atingir este objetivo, utilizaremos as variaes do atributo [Authorize].
Pgina 20
Este atributo possui argumentos nomeados que nos permitem informar o nome do usurio ou usurios, bem como o nome do grupo (role) ou grupos (roles) que esto autorizados a acessar o controller ou action associado ao atributo. A Figura 13 ilustra algumas das possveis variaes do atributo [Authorize].
desenvolvedores, https://developers.facebook.com/apps, cadastrar sua aplicao, obter as chaves appId e appSecret e editar o arquivo AuthConfig.cs localizado na pasta AppStart. As linhas 25-27 apresentam o mtodo RegisterFacebookClient que solicita estas duas chaves para integrar sua aplicao. Originalmente, estas linhas esto comentadas no arquivo AuthConfig.cs, necessrio remover os caracteres de comentrios para concluir sua integrao. Simples assim, no necessrio nenhuma linha de cdigo adicional, basta informar os atributos solicitados pelo mtodo RegisterFacebookClient (ou o mtodo correspondente rede social desejada) e sua aplicao j estar pronta para permitir que seus usurios utilizem suas credenciais para acessar as reas restritas. A Figura 14 apresenta o arquivo AuthConfig.cs.
Conceitos Bsicos
At este ponto, voc teve uma introduo ao modelo de desenvolvimento de uma aplicao ASP.NET MVC, entendeu o que so Models, Views e Controllers. Teve uma viso geral sobre o Razor Engine e o Entity Framework. Aprendeu como utilizar o SimpleMembershipProvider para autenticar e controlar o acesso dos usurios da sua aplicao, inclusive como integrar sua aplicao com as redes sociais mais conhecidas do mercado. Antes de prosseguirmos com aspectos mais avanados da implementao de uma aplicao MVC gostaria de abordar mais dois pontos bsicos, porm no menos importantes, a inicializao das aplicaes e as pginas de erros personalizadas.
Pgina 22
Figura 15: Mtodo MapRoute (RouteCollection) No exemplo ilustrado na Figura 15, se o desenvolvedor desejasse que a aplicao exibisse o formulrio de Login, implementado atravs da View Login.cshtml e gerenciado pela classe AccountController e o mtodo (action) Login, os parmetros sublinhados em amarelo deveriam ser substitudos como demonstrado a seguir:
... defaults: new { controller = Account, action = Login, id = UrlParameter.Optional } ...
Pgina 23
Pgina 24
Pgina 25
Camada de Negcios
Repositrios
Pgina 26
Figura 20: A aplicao de exemplo em tempo de execuo. O primeiro passo para reproduzir esta aplicao criarmos um novo projeto baseado no template ASP.NET MVC 4 Application. Este template oferece algumas opes para o desenvolvedor, exibidas na janela New ASP.NET MVC 4 Project, utilize o modelo Internet Application e o engine Razor como mostra a Figura 21. Denomine o projeto como NatterMvc.
Pgina 27
Para este exemplo, o desenvolvedor pode remover os controllers e views criadas pelo template, utilizaremos apenas a estrutura de pastas para codificar nossa aplicao. O primeiro passo criarmos o banco de dados. A estrutura do nosso banco de dados ser simples, apenas as tabelas de usurios (User), mensagens (Nats) e seguidores (Followers). Esta ltima utilizada para estabelecer um relacionamento de muitos-para-muitos, onde armazenaremos os cdigos de usurios seguidores e seguidos (followers e following). Uma vez definida a estrutura do banco de dados, crie um novo projeto do tipo Class Library que utilizaremos como nossa camada de acesso a dados. Denomine este projeto como NatterModel. Adicione uma referncia para o NatterModel no projeto NatterMvc. Adicione um novo item no projeto NatterModel, e selecione o item Data -> ADO.NET Entity Data Model para criar seu arquivo *.edmx. O Entity Framework se encarregar de criar as classes do nosso modelo. Veja a Figura 22.
Pgina 28
O prximo passo criarmos a Interface INatRepository. Esta Interface ser simples, dever conter trs mtodos: CreateMessage(int authorId, string text), DeleleMessage(int natId) e GetTimeLine() usados para criar, excluir e recuperar respectivamente as mensagens de texto da nossa aplicao. Isto facilitar a codificao do nosso repositrio. A Figura 23 apresenta o cdigo desta Interface.
Pgina 29
Figura 23: A Interface INatRepository Aps codificar esta Interface, nosso projeto NatterModel, estar completo. Certifique-se referenci-lo no projeto NatterMvc antes de seguirmos para o prximo passo.
Criando o mecanismo para IoC
Uma forma simples de ilustrarmos o conceito de IoC ser demonstrada neste passo. No projeto NatterMvc, na pasta Models, crie uma classe chamada Repositories. Adicione nesta classe o cdigo apresentado na Figura 24. Esta classe permitir ao desenvolvedor, substituir o repositrio sempre que desejar, sem alterar o funcionamento da aplicao. Por exemplo, voc pode utilizar repositrios falsos (mocks) para testar sua aplicao, ou ainda criar repositrios associados outras fontes de dados. Em qualquer caso, basta instanci-los na classe Repositories utilizando o mtodo Get da propriedade Nats. Esta uma forma prtica de implementarmos o conceito de Inversion of Control (IoC). Esta prtica facilita a mantenabilidade do cdigo e a criao de testes unitrios para validar suas regras de negcio.
Pgina 30
Finalmente vamos implementar nosso repositrio. Dentro da mesma pasta Models, crie uma nova classe denominada EFNatRepository. Este ser nosso repositrio. nesta classe que o desenvolvedor implementar os mtodos para interagir com a camada de acesso a dados. Os dois primeiros mtodos, apresentados na Figura 25, so GetTimeLine() e CreateMessage(). O primeiro responsvel por recuperar todas as mensagens gravadas no banco e exibi-las na linha do tempo da aplicao. O segundo mtodo se encarrega de inserir novas mensagens no banco de dados. Ambos utilizam o objeto DbContext chamado NatterSQLContext. Este objeto representa nosso banco de dados. As classes associadas ao contexto foram criadas automaticamente pelo Entity Framework. Dependendo do cenrio da sua aplicao ou das prticas adotadas pela sua empresa, voc pode mapear stored procedures do banco de dados para realizar estas tarefas utilizando o Entity Framework, ou mesmo criar um repositrio que utilize o classes do ADO.NET para implementar os mesmos mtodos. Lembre-se que seu repositrio precisa apenas respeitar o contrato da Interface INatRepository, dito isto, voc pode implementar os mtodos usando ADO.NET, Oracle ODP.NET, Entity Framework, Collections ou o que voc preferir para persistir os dados da sua aplicao. Este o benefcio de trabalharmos com repositrios.
Pgina 31
Figura 25: Os mtodos GetTimeLine() e CreateMessage() Observe que cada mtodo deste repositrio utiliza um bloco using para executar suas tarefas. Este bloco using, envolvendo as aes, garante que todos os recursos utilizados pelo objeto ctx (NatterSQLContext) sero liberados imediatamente aps concluir seu objetivo. Uma particularidade do mtodo GetTimeLine() refere-se a chamada ao mtodo auxiliar ToArray() para retornar o resultado da consulta. Isto necessrio, porque as consultas LINQ so objetos do tipo lazy evaluated, o que significa que esses objetos representam apenas estruturas de consultas at que um mtodo como ToArray(), ToList() ou ToDictionary() seja invocado para que a consulta seja efetivamente executada contra o banco e os registros recuperados.
Pgina 32
O mtodo DeleteMessage() demonstra uma forma de otimizao para evitarmos roundtrips desnecessrias at o banco de dados. A Figura 26 que apresenta a primeira verso do mtodo DeleteMessage(). Observe que a linha 46 executa uma consulta ao banco de dados para recuperar o objeto Nat que ser marcado para excluso com o mtodo Remove do DbContext. Isto significa que antes de executar a excluso deste registro, nossa aplicao literalmente vai at o banco de dados para recuperar o objeto que corresponde ao Id que se deseja excluir. Este roundtrip pode ser evitado.
Figura 26: O mtodo DeleteMessage() com um roundtrip desnecessrio Observe agora uma implementao diferente para o mesmo mtodo. O uso do mtodo Attach do objeto DbContext um recurso muito til para este cenrio, e ele evita que a aplicao v at o banco para recuperar o objeto que deseja-se excluir. O prprio mtodo Attach se encarrega de marcar o objeto correto para excluso. A construo simples, mas cabe aqui uma explicao. Observe com ateno que o mtodo DeleteMessage(), desta vez, espera dois argumentos natId e authorId, ambos nmeros inteiros que correspondem ao cdigo da mensagem de texto e cdigo do autor desta mensagem. Mas, o desenvolvedor pode estar perguntando por que vamos passar o cdigo do autor se o j temos o Id da mensagem? O que acontece aqui, que o EntityFramework trata os relacionamentos como objetos de primeira classe, ou seja, para voc excluir um registro de uma entidade, voc deve conhecer as chaves-extrangeiras desta entidade. Quando utilizamos a construo anterior (Figura 26), a aplicao vai at o banco e recupera um objeto Nat, que j contm este relacionamento. Para evitarmos esta viagem at o banco, com o objetivo de melhorar a performance da nossa aplicao, precisamos informar corretamente o objeto que desejamos excluir. Por este motivo que o cdigo do autor da mensagem deve ser includo no mtodo DeleteMessage(). Confira o cdigo na Figura 27.
Pgina 33
O conceito de UnitOfWork est baseado na capacidade da aplicao de isolar aes especficas, como demonstrado nos mtodos do nosso repositrio acima. Quando utilizamos os blocos Using para delimitar o processamento da ao, estamos na verdade criando UnitsOfWork. Neste modelo, o desenvolvedor pode criar vrias UnitsOfWork (aes), process-las isoladamente, e apenas submet-las contra o banco de dados quando desejado. Pense neste modelo de UnitsOfWork como uma transao.
Codificando nosso HomeController
Agora que j implementamos nosso repositrio, interfaces e modelos, precisamos nos preocupar com os objetos HomeController e a View correspondente. Para implementar nosso Controller, v para a pasta Controllers, clique com o boto direito do mouse sobre a pasta. No menu de contexto, selecione a opo Add -> Controller. E escolha o template Empty MVC controller, como mostra a Figura 28.
Pgina 34
Figura 28: A janela Add Controller Modifique o cdigo deste controller para que fique exatamente como apresentado na Figura 29. Observe como o cdigo do nosso controller ficou limpo, temos apenas as chamadas para os mtodos do nosso repositrio. A classe Repositories responsvel por direcionar as chamadas para o repositrio desejado. Nosso controller tem apenas trs aes: Index (utilizada para invocar o mtodo GetTimeLine() e exibir as mensagens na pgina), Create que utiliza o mtodo CreateMessage() para inserir um novo registro de mensagem no banco de dados e a ao Delete que dispara o mtodo DeleteMessage() do nosso repositrio para excluir uma mensagem j cadastrada. Observe que o mtodo Create() possui um atributo [HttpPost] associado a ele. Isto necessrio para que este mtodo aceite posts enviados pela View. Este mesmo atributo poderia ser escrito utilizando a notao [AcceptVerbs(HttpVerbs.Post)], sem alterao em seu comportamento.
Pgina 35
E como ltima pea da nossa aplicao de exemplo, temos a View/Home. Para criar esta View, v para a pasta Views, crie uma pasta chamada Home (se no existir). Clique com o boto direito do mouse sobre a pasta Home, e no menu de contexto, selecione Add -> View. Na janela que ser exibida informe o nome da view como Index, certifique-se que o View engine est definido como Razor (CSHTML), marque a opo Create a strongly-typed view e selecione a classe Nat (NatterModel.Models) para a propriedade Model Class. A janela Add View, permite ao desenvolvedor escolher entre os scaffold templates Create, Delete, Details, Edit, Empty e List. Cada um oferece um layout diferente para a view. O objetivo aqui apenas de agilizar a tarefa de construo da view.
Pgina 36
Contudo, numa aplicao real, muitas vezes, o desenvolvedor criar uma view vazia (Empty template) para adequar seu layout ao padro criado por designers e aprovado pelo usurio.
Figura 30: A janela Add View Uma vez criada a View Home/Index, modifique seu contedo para que fique exatamente como apresentado na Figura 31.
Pgina 37
Figura 31: A View Home/Index Analisando o cdigo apresentado na Figura 31, o desenvolvedor poder observar a principal vantagem do Razor engine a sintaxe. Simples, limpa e fcil de usar. O caracter @ indica o incio de um bloco de processamento no servidor, e voc pode combinar cdigo HTML com cdigo processado no servidor, como mostra a linha 27 onde o nome da imagem formado pelo Id do Autor concatenado com o path da pasta e a extenso (*.png) do arquivo. Outro exemplo a prpria tabela criada para apresentar as mensagens de texto. O contedo do elemento <table> est envolvido pelo bloco @foreach que inicia na linha 24 e termina na linha 39. Mais um exemplo nesta view o formulrio criado com o mtodo Html.BeginForm na linha 13 que combina um controle TextBox gerado pelo objeto Html.TextBox com um boto criado com o cdigo HTML <input type=submit>. O mtodo Html.BeginForm requer dois parmetros: Ao (Action) e Controller. Ao submeter o formulrio, a aplicao enviar os dados para o controller/ao informados nos parmetros. O controller por sua vez, processar o request.
Pgina 38
Aps concluir a View Home/Index, nossa aplicao de exemplo estar pronta para ser executada. Sua aparncia deve ser semelhante a Figura 20 deste tutorial. Neste exemplo simples, apresentamos o funcionamento de uma aplicao MVC, aplicamos os conceitos baseados no Model 2 (uma variao do padro MVC), incluindo o uso de repositrios, Inversion of Control (IoC) e UnitOfWork.
Pgina 39
Uma forma simples de validar tipos de dados especficos utilizarmos o atributo de validao [DataType], que nos permite definir dois argumentos nomeados, o tipo de dados (propriedade DataType) que o campo espera receber, e a mensagem de erro (ErrorMessage) que ser exibida para o usurio caso ele informe um tipo invlido para este campo. Os tipos de dados disponveis neste atributo esto apresentados na Tabela 3. Tipos de Dados Currency Custom Date DateTime Duration EmailAddress Html ImageUrl MultilineText Password PhoneNumber Text Time Url Tabela 3: Tipos de Dados do Atributo de Validao [DataType] Obviamente, os formatos para Data e Nmero de Telefone esto, por padro, no formato americano e devem ser customizados para atender nossas necessidades. A Figura 32 mostra o atributo DataType sendo utilizado para a propriedade Email de uma classe. Atributo DataType
Pgina 40
A validao para campos requeridos simples. Basta adicionarmos o atributo de validao [Required] sobre a propriedade que desejamos tornar obrigatria. Assim como todos os atributos de validao, o desenvolvedor pode utilizar o argumento nomeado ErrorMessage para definir a mensagem que ser exibida para o usurio quando esta regra no for atendida. A Figura 32, na linha 64 temos o exemplo do atributo de validao [Required].
Validao com RegularExpressions
Tambm possvel implementar a validao utilizando RegularExpressions. A Figura 33 apresenta um exemplo de validao da mesma propriedade Email utilizando uma RegularExpression.
Este sem dvida o atributo mais utilizado. O atributo [Display] oferece dois argumentos nomeados, Name e Description. O primeiro define o texto que ser exibido como label do controle associado propriedade ao qual o atributo est vinculado. Por exemplo, para uma propriedade denominada AuthorId, o desenvolvedor pode definir o argumento Name como Cdigo do Autor, quando o engine do MVC processar a View correspondente, o texto exibido ao lado do controle associado propriedade AuthorId ser Cdigo do Autor. O segundo argumento nomeado, Description, pode ser utilizado como complemento, a informao colocada neste argumento ser exibida como ToolTip no controle associado propriedade.
Custom ValidationAttributes
No podemos esquecer da validao de propriedades como CNPJ e CPF. Para casos como estes, podemos implementar atributos de validao customizados. Os validadores customizados devem herdar a classe ValidationAttribute e o contrato da Interface IClientValidatable. Esta Interface requer o mtodo GetClientValidationRules. Uma informao importante, refere-se ao nome do atributo. Os atributos de validao devero sempre apresentar o sufixo Attribute imediatamente aps sua denominao. Por exemplo, o atributo CPF dever chamar-se CPFAttribute, para CNPJ o mesmo CNPJAttribute. Por outro lado, a notao com DataAnnotationClasses suprime o sufixo Attribute, permitindo que o desenvolvedor adicione seu atributo apenas com o [CPF] ou [CNPJ].
Pgina 41
A Figura 34 apresenta a estrutura para o atributo de validao de CPF. A classe completa deste validador, pode ser encontrada nos arquivos do projeto de exemplo que esto disponveis junto com este tutorial.
Outra necessidade comum no desenvolvimento de aplicaes o uso de mscaras para entrada de dados. Neste exemplo no estamos utilizando nenhum componente de terceiros, como Telerik, Infragistics, DevXpress, bastante conhecidos no mercado. Esses componentes, em sua maioria, oferecem vrios recursos que facilitam a vida do desenvolvedor. Desta forma, precisamos recorrer a outros mecanismos que proporcionem resultados similares. Uma prtica comum, neste caso, o uso de scripts JQuery para aplicar as mscaras de entrada. Sem muito esforo, o desenvolvedor pode concluir esta tarefa. A Figura 35 apresenta o cdigo JQuery utilizado para aplicar mscaras de Telefone, CPF, Data e CEP. Para que este script funcione corretamente, o desenvolvedor deve certificar-se de ter adicionado o arquivo jquery.maskedinput-1.3.min.js ao projeto.
Pgina 42
Considere o cenrio de uma aplicao comercial, onde voc precisa exibir DropDownLists para selecionar Estado e Cidade. Os dados j esto armazenados no banco de dados, e as entidades expostas pelo DbContext criado pelo EntityFramework. Como podemos carregar esses controles numa aplicao MVC? Na verdade, existem diversas formas para alimentarmos controles do tipo lista em aplicaes MVC. A forma apresentada neste tutorial prtica e apresenta uma implementao muito simples. O primeiro passo criarmos uma View que encapsular o controle de lista. V para pasta Views, Shared e crie uma pasta chamada EditorTemplates (se no existir). Dentro desta pasta, crie uma View utilizando o Empty Template (vazio). No arquivo criado, modifique o cdigo para que fique exatamente como apresentado na Figura 36. Este arquivo ser responsvel por informar a UI que o editor para a propriedade EstadoId ser um controle DropDownList que exibir todos as unidades da federao e estados gravados no banco de dados.
Pgina 43
Figura 36: O EditorTemplate para propriedade EstadoId Uma vez criado este template, com a ajuda do atributo [UIHint] associado propriedade EstadoID, e o engine do ASP.NET MVC se encarregar de exibir o controle DropDownList devidamente carregado. Observe a Figura 37 que utiliza o atributo [UIHint] para associar o EditorTemplate s propriedades CidadeID e EstadoID.
Outra tarefa comum neste mesmo cenrio, refere-se a capacidade de filtrarmos os registros apresentados em um controle DropDownList com base no registro selecionado pelo usurio em outro controle do mesmo tipo. Por exemplo, quando o usurio selecionar o Estado desejado no controle explicado no tpico anterior, nossa aplicao dever carregar o controle de lista associado propriedade CidadeID com as cidades pertencentes ao estado selecionado. Com algumas linhas de cdigo adicionais, um pouco de JQuery + JSON, e esta tarefa ser facilmente concluda. Observe a ao GetCidades() adicionada classe ConsumidorController. Esta ao ser invocada a partir de uma funo JQuery publicada na View Consumidor/Create. A Figura 38 apresenta o cdigo que implementa a ao GetCidades().
Pgina 44
Figura 38: A ao GetCidades da classe ConsumidorController A funo JQuery, para implementar a carga em cascata do controle DropDownList CidadeID, tambm simples. A Figura 39 apresenta o cdigo necessrio para esta funo.
Pgina 45
Para utilizarmos o controle PagedList em nosso projeto, em primeiro lugar, preciso instalar este controle a partir do Package Manager Console. O comando para instalao simples, basta digitar Install-Package PagedList.Mvc na linha de comando do Package Manager Console (Menu Tools -> Library Package Manager. No topo classe Controller, onde utilizaremos o PagedList, necessrio acrescentar a declarao: using PagedList. Uma vez adicionada esta declarao, vamos modificar o contedo da nossa ao Index para acrescentarmos os parmetros necessrios para o controle PagedList. Ao final deste processo, o cdigo da nossa ao Index dever apresentar construo semelhante apresentada na Figura 40.
Figura 40: A ao Index modificada para o controle PagedList. Observe na Figura 40, a linha em destaque, o mtodo ToPagedList(pageNumber, pageSize), este o mtodo responsvel por implementar efetivamente a paginao dos registros. No exemplo acima, o tamanho da pgina (pageSize) definido do arquivo Web.config e recuperado com o auxlio do objeto ConfigurationManager. A View que apresentar os registros paginados, tambm deve sofrer as alteraes necessrias. A primeira delas a declarao da classe Model que deve que deve ser derivada da Interface IPagedList, como mostra a Figura 41.
Pgina 46
Figura 41: A declarao da classe Model E finalmente, acrescentamos o cdigo que exibir os links para navegao atravs das pginas. Este cdigo, deve ser colocado logo abaixo do bloco foreach utilizado para listar os registros. O cdigo na ntegra est disponvel com a aplicao de exemplo distribuda junto com este tutorial. A Figura 42 apresenta o fragmento do cdigo necessrio para o PagedList.
Concluso Final
H muitos e diferentes modelos para construirmos uma aplicao MVC. O modelo apresentado neste tutorial baseia-se em prticas recomendadas para o mercado. Sugiro que o desenvolvedor aprofunde seus conhecimentos visitando o portal www.asp.net/mvc.
Pgina 47
Referncias
Adam Tulipers Blog http://completedevelopment.blogspot.com.br/ Alex James Blog http://blogs.msdn.com/b/alexj/ Channel 9 http://channel9.msdn.com/ Entity Framework Developer Center http://msdn.com/ef Portal ASP.NET MVC http://www.asp.net/mvc/ NuGet Gallery PagedList http://nuget.org/packages/PagedList.Mvc Martijn Bolands Blog http://blogs.taiga.nl/martijn/
Pgina 48