Escolar Documentos
Profissional Documentos
Cultura Documentos
Introducao ASPNET MVC4
Introducao ASPNET MVC4
NET MVC 4
C# + Entity Framework + Razor Engine
Conceitos Bsicos....................................................................................................................... 22
Inicializao de Aplicaes MVC ............................................................................................................ 23
Pgina 2
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
Suporta o modelo de eventos que preserva o estado da pgina atravs do protocolo HTTP,
o que beneficia o desenvolvimento de aplicaes LOB (Line-of-Business). O modelo
baseado em Web Forms oferece dzias de eventos que so suportados em centenas de
server-controls.
Utiliza View State e server-based Forms, que facilitam o gerenciamento de estado entre os
postbacks.
Funciona bem para pequenos times de desenvolvedores e designers que podem explorar
um grande nmero de componentes disponveis para o modelo de desenvolvimento RAD
(Rapid Application Development).
Em geral, apresenta uma complexidade menor, em razo dos componentes (Page Class,
controles, modelo de eventos, etc.) bem integrados que exigem menos cdigo quando
comparados ao modelo MVC.
Pgina 6
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
Cenrios
Novo Banco de Dados
Pgina 11
Pgina 12
O mtodo InitializeDatabaseConnection
O objeto WebSecurity implementa o mtodo InitializeDataBaseConnection. Este mtodo requer
cinco argumentos, descritos na Tabela 1.
DefaultConnection
Pgina 13
Pgina 14
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.
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
Argumentos
string[] Users, string roleName
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
Pgina 19
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].
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
Pgina 23
Pgina 24
Pgina 25
Camada de Negcios
Repositrios
Camada de Acesso a
Dados
Figura 18: Repositrios para isolar as camadas de Negcio e Dados
Pgina 26
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
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
Pgina 32
Pgina 33
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
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.
Pgina 37
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.
Atributo
DataType
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.
Pgina 40
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.
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
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
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.
Pgina 46
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