Desenvolvimento Web Com ASP - Net MVC - Casa Do Codigo
Desenvolvimento Web Com ASP - Net MVC - Casa Do Codigo
Casa do Código
Livros para o programador
Rua Vergueiro, 3185 - 8º andar
04101-300 – Vila Mariana – São Paulo – SP – Brasil
Casa do Código
Agradecimentos
Uma obra como esta é sempre fruto do esforço direto ou indireto de muitas pessoas.
Assim, nada mais justo que dedicar algumas poucas, mas expressivas, palavras a elas.
i
Casa do Código
Sobre os autores
iii
Casa do Código
iv
Casa do Código
Prefácio
v
Casa do Código
forma ASP.NET, você certamente vai querer ter uma visão clara e profunda do que
ASP.NET MVC tem para oferecer. Eu espero que você se divirta com volume de
aprendizado sobre ASP.NET que o espera neste livro. Aproveite o livro do Fabricio
e do Márcio.
Scott Hanselman
Principal Program Manager – Azure and Web Tools
Microsoft Corp.
vi
Casa do Código Sumário
Sumário
vii
Sumário Casa do Código
Bibliografia 167
viii
Capítulo 1
2
Casa do Código Capítulo 1. Sua primeira aplicação
Com o Visual Studio 2012 em execução, navegue até a opção File > New >
Project. Nossa intenção é criar uma nova aplicação para web — desta forma, na
janela que se apresentará, você deverá selecionar do lado esquerdo a opção “web” e
na sequência (lado direito), “ASP.NET MVC Web Application”. A figura 1.1 apresenta
a janela com a seleção mencionada.
3
1.1. E então, vamos começar? Casa do Código
Tecnologias utilizadas
4
Casa do Código Capítulo 1. Sua primeira aplicação
Após a criação do projeto, você verá no “Solution Explorer” (janela onde os ar-
quivos do projeto são dispostos) do seu Visual Studio, uma estrutura de projeto pare-
cida com aquela apresentada pela figura 1.3. Não se preocupe agora com os detalhes
estruturais do projeto, eles serão explicados em detalhes nos próximos capítulos.
5
1.1. E então, vamos começar? Casa do Código
Muito embora o Visual Studio já crie uma estrutura de projeto funcional, antes
de executar a aplicação pela primeira vez, faremos uma pequena modificação no
corpo da mesma. No Solution Explorer, navegue até o arquivo “HomeController”
( SeuProjeto > Controllers > HomeController). No método Index,
faremos uma alteração simples: modificaremos uma mensagem que é exibida
por padrão, na página inicial. Modifique o texto atribuído à propriedade “View-
Bag.Message” para “Minha primeira aplicação com ASP.NET MVC”, conforme
apresentado pela listagem 1.
return View();
}
6
Casa do Código Capítulo 1. Sua primeira aplicação
Compile o projeto (você pode utilizar a tecla F5 como atalho para executar esta
tarefa) e quando o site for carregado em seu navegador, a mensagem que acabamos
de adicionar deverá ser exibida, a exemplo do que apresenta a figura 1.4.
7
1.2. Código fonte e lista de discussão Casa do Código
8
Capítulo 2
10
Casa do Código Capítulo 2. Entendendo a estrutura de uma aplicação ASP.NET MVC
Vale ressaltar que apontar defeitos não é dizer que determinada tecnologia é
ruim. O ASP.NET WebForms ainda é muito utilizado, mas — como tudo — tem
prós e contras e, em alguns cenários, os defeitos apresentados por ele são maiores
que os benefícios. Mesmo utilizando ASP.NET WebForms é possível ter um desen-
volvimento que permite testes ou baixo acoplamento, mas devido à forma de traba-
lho com a tecnologia, o esforço para garantir esses ideais é alto utilizando ASP.NET
WebForms.
Como o cenário web transformou-se rápida e amplamente nos anos posteriores
(mudança alavancada principalmente pelos negócios, que também passaram a ser
realizados neste ambiente), fez-se necessária a estruturação de uma nova tecnolo-
gia para desenvolvimento web dentro da plataforma .NET, que atendesse às novas
demandas de mercado e que pudesse endereçar os problemas mencionados anteri-
ormente. Surgiu então, o ASP.NET MVC.
11
2.2. Voltando à nossa primeira aplicação Casa do Código
Convenções?
12
Casa do Código Capítulo 2. Entendendo a estrutura de uma aplicação ASP.NET MVC
• Views: agrupa os elementos a serem visualizados pelo usuário final (as famo-
sas views). Nome bem sugestivo, não?!
• App_Data: aqui o MVC entende que você poderá posicionar arquivos a serem
consumidos por seu projeto, como imagens, vídeos, áudios etc;
Existe ainda um diretório convencionado pelo ASP.NET MVC que não aparece
em nosso projeto exemplo e que, portanto, não foi apresentado na lista anterior.
Trata-se do App_Code. Ele não aparece na estrutura de diretórios da aplicação exem-
plo por um motivo muito simples: ele recebe arquivos Razor [3] provenientes de
“Helpers” terceiros e a aplicação exemplo não implementa qualquer helper terceiro.
Falaremos muito de helpers durante os capítulos posteriores, por isso, já é im-
portante que você se familiarize com este termo.
13
2.3. Um pouco mais sobre convenções Casa do Código
14
Casa do Código Capítulo 2. Entendendo a estrutura de uma aplicação ASP.NET MVC
15
2.4. Navegação baseada em rotas Casa do Código
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home",
action = "Index",
id = UrlParameter.Optional
}
);
}
16
Casa do Código Capítulo 2. Entendendo a estrutura de uma aplicação ASP.NET MVC
http://localhost:1153/
Vale lembrar mais uma vez que Home e Index são valores padrão na rota pa-
drão do ASP.NET MVC. Opcionalmente, seria possível adicionar à URL um va-
lor chave para identificar algum objeto. Desta forma, poderíamos ter algo como
http://localhost:1153/Home/Index/200 por exemplo. Entretanto, muito embora seja pos-
sível realizar tal adição, no caso do exemplo discutido não faz sentido fazê-lo, pois
não estamos identificando de forma unitária algum elemento (como http://localhost:
1153/Clientes/Perfil/18556 ). Por este motivo, o último parâmetro da rota padrão é de-
finido como opcional ( id = UrlParameter.Optional).
A figura 2.3 apresenta um esquema funcional que ilustra (de forma simplificada)
o mecanismo de roteamento implementado pelo ASP.NET MVC.
17
2.5. Concluindo e desafiando Casa do Código
usuário final ao interagir com ela, poderemos encontrar alguns problemas, dentre os
quais se destacam: dificuldade de memorização e baixa legibilidade.
Além disso, é importante observar o impacto negativo destas URLs nas técnicas
de Search Engine Optimization (SEO) [2]. Note que os principais robôs de indexa-
ção de conteúdos de sites de busca (Google, Bing etc.), desconsideram URLs que
apresentam alguns caracteres especiais, tais como: &, @, % etc.
Levando-se em consideração estes aspectos, ASP.NET MVC implementa através
do mecanismo de rotas o modelo de URLs amigáveis. Assim, além tornar a URL
da aplicação indexável para os robôs de busca, o framework melhora a experiência
navegação do usuário, uma vez que é bem mais fácil de interagir com uma URL como
http://seusite.com/Conteudos/Artigos/987511.
18
Capítulo 3
lers.
Assim como a grande maioria das aplicações do mundo real, vamos construir
passo a passo uma área administrativa para nossa aplicação, afinal de contas, preci-
samos saber quem está inserindo informações em nossa base de dados — e, claro,
precisamos de segurança. Ao projetar a aplicação, levaremos em consideração tam-
bém aspectos como a utilização em dispositivos móveis, boas práticas de programa-
ção e design.
20
Casa do Código Capítulo 3. Projetando a aplicação “Cadê meu médico?”
(também pública) de consulta aos médicos mas, desta vez, voltada para dis-
positivos móveis.
Para que a proposta da aplicação “Cadê meu médico?” torne-se mais clara sob
os pontos de vista funcional e arquitetural, apresentamos alguns detalhes acerca da
mesma. Assim, convidamos a considerar a figura 3.1.
21
3.1. Cadê meu médico? Casa do Código
Diagrama Entidade-Relacionamento?
22
Casa do Código Capítulo 3. Projetando a aplicação “Cadê meu médico?”
23
3.2. Criando a aplicação Casa do Código
até o menu superior e lá selecione a opção File > New > Project. Na janela que
se apresentará, selecione à esquerda a opção “web” e na sequência, a opção “ASP.NET
MVC Application” à direita. A figura 3.3 apresenta a seleção a qual nos referimos.
Isto feito, uma nova janela será apresentada pelo Visual Studio. Ela exibe alguns
templates disponíveis para a criação de uma aplicação ASP.NET MVC. Você deve se
lembrar que em nossa primeira aplicação de exemplo, escolhemos o template “Inter-
net Application”. Como resultado desta escolha, o Visual Studio cria uma estrutura
base e adiciona várias referências ao projeto, além de definir um layout padrão.
Para este segundo e mais completo exemplo, vamos utilizar o template blank,
através do qual o Visual Studio cria apenas a estrutura básica de diretórios, e adiciona
os códigos de inicialização da aplicação (como a configuração do roteamento padrão,
por exemplo). A figura 3.4 mostra a seleção mencionada.
24
Casa do Código Capítulo 3. Projetando a aplicação “Cadê meu médico?”
Utilizando o template básico, temos algum trabalho para criar o layout, adicionar
referências etc. Muito embora estejamos conscientes em relação a este fato, isto está
sendo feito propositalmente, uma vez que servirá para apresentar truques e exaltar
ferramentas do Visual Studio que nos auxiliam na construção das aplicações. Vale
lembrar que quando começamos um projeto, nem sempre podemos utilizar o layout
e bibliotecas que a ferramenta sugere. Por isso o conhecimento para criar uma apli-
cação desde o início é importante!
Após a criação do projeto, a estrutura de diretórios apresentada no Solution Ex-
plorer deverá ser semelhante à apresentada pela figura 3.5.
25
3.3. Referenciando bibliotecas Casa do Código
26
Casa do Código Capítulo 3. Projetando a aplicação “Cadê meu médico?”
Encontrar e utilizar bibliotecas úteis nos projetos pode ser uma tarefa complexa,
tendo em vista a enorme “oferta” de bibliotecas para solucionar os mesmos tipos e
classes de problemas. Assim, é preciso estar atento para escolher aquela que melhor
atende às necessidades do projeto. Além disso, existem outros aspectos que acabam
gerando problemas no gerenciamento de bibliotecas: instalação, atualização, depen-
dências etc.
A boa notícia é que os problemas mencionados anteriormente não existem mais
se você é usuário do Visual Studio. Isso graças a uma ferramenta introduzida pela
Microsoft no Visual Studio 2010 com suporte ao ASP.NET MVC a partir da versão
3, chamada NuGet. A lista a seguir apresenta alguns dos benefícios proporcionados
pelo NuGet.
27
3.3. Referenciando bibliotecas Casa do Código
28
Casa do Código Capítulo 3. Projetando a aplicação “Cadê meu médico?”
É pertinente observar neste ponto o fato de que, para instalar as bibliotecas ne-
cessárias ao nosso projeto via NuGet, estamos utilizando a ferramenta gráfica dispo-
nibilizada pelo Visual Studio para este fim. Muito embora tal ferramenta seja fun-
cional e atenda às necessidades, vale mencionar que esta não é a única forma de
trabalho disponível. Desenvolvedores que possuem preferência por trabalhar com
linhas de comando também são atendidos pelo Visual Studio. Isso é feito através da
ferramenta Package Manager Console, acessível através do menu superior na opção
Library Package Manager.
Ao acessar a opção mencionada, o Visual Studio apresentará um console no qual
os comandos poderão ser digitados. Você poderá fazer praticamente qualquer ope-
29
3.4. Criando o layout da aplicação Casa do Código
ração com NuGet via linha de comandos. A “linguagem” aceita pelo NuGet para
os inputs de comandos é o PowerShell. Você pode encontrar um guia de referência
completo sobre os comandos aceitos pelo NuGet via PowerShell seguindo o link:
http://bit.ly/referenciapowershell
Para saber mais sobre o PowerShell, você deve pode utilizar:
http://bit.ly/guiapowershell
30
Casa do Código Capítulo 3. Projetando a aplicação “Cadê meu médico?”
O modelo de trabalho com master pages oferecido pelo ASP.NET MVC é ligeira-
mente diferente daquele proporcionado pelos web forms. Você pode encontrar um
bom texto de referência acerca da utilização de master pages com web forms seguindo
o link apresentado pela referência [5].
Muito embora as abordagens sejam diferentes, o conceito é rigorosamente o
mesmo e iremos utilizá-lo amplamente em nosso projeto. Assim, na Solution Ex-
plorer, clique com o botão direito do mouse na pasta Views e navegue pelas opções
Add > View. A figura 3.9 ilustra este processo.
Na sequência, uma janela onde iremos informar mais detalhes acerca de nossa
View será apresentada. Informe o nome Layout, e desmarque a opção Use a layout
or master page. Essa opção é justamente a que vamos marcar na criação de alguma
View que irá utilizar nossa Master Page. Feito isso, clique no botão Ok. A figura 3.10
mostra essa etapa.
31
3.4. Criando o layout da aplicação Casa do Código
Após a criação do arquivo, o Visual Studio vai abrir a nossa View para edição.
Você deverá ver um código parecido com o código da listagem 1.
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Layout2</title>
</head>
<body>
<div>
32
Casa do Código Capítulo 3. Projetando a aplicação “Cadê meu médico?”
</div>
</body>
</html>
Antes de modificar o HTML gerado pelo Visual Studio para a master page, é
preciso notar um aspecto importante. Note que, no início do código, à propriedade
“Layout” é atribuído o valor “null”. Pois é justamente esta a propriedade que recebe
a indicação do layout padrão, ou seja, a master page da qual a página herdará.
Precisamos concordar, neste ponto, que executar tal atribuição em todas as pá-
ginas de uma aplicação não é lá muito produtivo. Imagine um projeto grande, com
muitas views. Esta prática tornaria onerosas demais tanto a implementação quanto
a manutenção dos arquivos de layout do projeto no caso de uma possível troca de
master page. Além disso, salta à vista a ausência do conceito de reutilização de có-
digo.
O que faremos agora é criar uma nova view que será responsável por definir essa
propriedade em todas as views da nossa aplicação. Para isso, novamente vá até a
Solution Explorer, clique com o botão direito do mouse na pasta Views e navegue
pelas opções Add > View. A figura 3.11 ilustra este processo.
Agora, na janela onde informaremos os detalhes acerca de nossa nova view, uti-
lizaremos o nome _ViewStart. Ainda nesta janela, desmarque também a opção
Use a layout or Master Page, e clique em Ok.
Note que, novamente, a Convenção sobre Configuração nos ajuda neste caso. Por
quê? Uma view chamada _ViewStart será executada no início da renderização
de todas as views da aplicação. Voltando à configuração, vamos configurar a
propriedade Layout na nossa _ViewStart, conforme apresenta a listagem 2.
@{
33
3.4. Criando o layout da aplicação Casa do Código
Layout = "~/Views/Layout.cshtml";
}
<!DOCTYPE html>
<html lang="pt-br">
<head>
<meta name="viewport" content="width=device-width" />
<title>Cade meu medico? - @ViewBag.Title</title>
<link href="@Url.Content("~/Content/bootstrap/bootstrap.min.css")"
rel="stylesheet" />
<style>
body {
padding-top: 60px;
}
</style>
</head>
<body>
<div class="navbar navbar-inverse navbar-fixed-top">
<div class="container">
<div class="navbar-header">
<a class="navbar-brand" href="#">Cade meu medico?</a>
</div>
<div class="collapse navbar-collapse">
<ul class="nav navbar-nav">
<li class="active"><a href="#">Home</a></li>
<li id="menuPaises">
@Html.ActionLink("Países", "Index", "Paises")
</li>
</ul>
</div>
</div>
</div>
<div class="container">
34
Casa do Código Capítulo 3. Projetando a aplicação “Cadê meu médico?”
@RenderBody()
</div>
<script src="@Url.Content("~/Scripts/jquery-2.0.2.min.js")">
</script>
<script src="@Url.Content("~/Scripts/bootstrap.min.js")">
</script>
@RenderSection("script", required: false);
</body>
</html>
35
3.4. Criando o layout da aplicação Casa do Código
seção onde os scripts serão renderizados. Como nem toda página possuirá algum
script, essa seção não é obrigatória e por isso, utilizamos o "required:false”.
Layout padrão criado, é hora então de testar o mesmo com uma página de teste
em nossa aplicação. Na Solution Explorer, clique com o botão direito na pasta Con-
trollers e navegue até as opções Add > Controller. A figura 3.12 ilustra este pro-
cesso.
Na janela que será exibida a seguir, defina o nome do controller como “Teste-
LayoutController”. Lembre-se, todo controller deve possuir o sufixo Controller (mais
uma vez o CoC atuando). A figura 3.13 representa isso.
36
Casa do Código Capítulo 3. Projetando a aplicação “Cadê meu médico?”
O próximo passo consistirá da criação de uma nova view, que será apresentada
quando o método Action do Controller for chamado. Recorde que uma das Con-
venções sobre Configuração é que a view deverá ficar em uma pasta com o nome
do Controller, e a View deverá ter o nome da Action. Felizmente o Visual Studio
automatiza esse trabalho!
Mais uma vez é importante observar que você não deve estar tão preocupado se
estiver achando estranho os termos Controller, Action etc. Eles serão apresentados
de forma detalhada nos capítulos a seguir.
Clique com o botão direito do mouse sobre o código View() e navegue até a
opção Add View. A figura 3.14 ilustra este processo.
Na janela que será apresentada, você poderá notar que o nome da view já estará
definido, e se a opção "Use a layout or master page” não estiver selecionada, você deve
fazê-lo. Não informe nenhum valor no campo. Com o campo em branco, o MVC vai
usar por padrão o arquivo criado anteriormente (a saber, _ViewStart). A figura
3.15 mostra essa etapa.
37
3.4. Criando o layout da aplicação Casa do Código
Após a criação do arquivo, o Visual Studio abrirá o código e ele deve estar
parecido com a listagem 5. Repare que podemos alterar na própria view o valor do
ViewBag.Title, que será concatenado com o título das páginas. Altere o valor
para "Teste de layout”
<h2>Index</h2>
Feito isso, compile seu projeto, através do pressionar da tecla F5 no Visual Stu-
dio. Quando o aplicativo for carregado, provavelmente uma página de erro será mos-
38
Casa do Código Capítulo 3. Projetando a aplicação “Cadê meu médico?”
trada, já que não definimos um Controller padrão. Mas tudo bem, isto é proposital.
Digite ao final da URL a fração de string “/testelayout” que nossa página de teste
será exibida. A figura 3.16 ilustra este processo.
39
Capítulo 4
4.1 Model?!
Um dos grandes objetivos que o framework ASP.NET MVC pretende alcançar é a se-
paração de responsabilidades entre as camadas de uma aplicação. Neste contexto,
a palavra “separação” poderia tranquilamente ser substituída pela palavra “isola-
mento”, uma vez que esta última passa mais o sentido que pretende endereçar.
Como já sabemos, os models são a parte de um projeto ASP.NET MVC responsá-
vel por agrupar — tendo em mente este modelo separatista do framework — as fontes
de dados de uma aplicação, seja esta fonte de dados for um banco de dados, um web-
service, um arquivo XML, um arquivo texto, entre outros. A ideia fundamental é que
as fontes de dados fiquem isoladas de forma literal das demais camadas.
Mas para que possamos entender os modos operandi do framework junto aos
models, apresentaremos algumas abordagens possíveis de forma atrelada ao nosso
projeto de exemplo. Mãos à obra?!
42
Casa do Código Capítulo 4. Models: Desenhando os modelos da nossa aplicação
Em aplicações ASP.NET MVC, você pode optar por criar seus repositórios de
acesso a dados utilizando, de forma direta, as classes e recursos do ADO.NET. Neste
caso, basta que você crie seu método de conexão ao banco e os demais métodos de
acesso e execução das sentenças SQL.
Se você está sendo apresentado a este set de recursos através deste texto, os tre-
chos de código apresentados na sequência poderão ajudar a entender o modos ope-
randi deste modelo.
Se houvesse a necessidade de nos conectarmos a um banco de dados, levando-se
em consideração o fato de que a string de conexão pudesse variar, por exemplo,
poderíamos ter um método de conexão fictício “ConectaNoBancoDeDados”. Ele
utiliza a classe “SqlConnection” presente no namespace “System.Data.SqlClient”,
conforme apresenta a listagem 1.
43
4.2. Abordagens para a criação de Models Casa do Código
Listagem 4.1 - Método fictício para conexão com o banco de dados via ADO.NET:
using System.Data.SqlClient;
public bool ConectaNoBancoDeDados(string stringDeConexao)
{
SqlConnection objetoDeConexao = new SqlConnection(stringDeConexao);
try
{
objetoDeConexao.Open();
if(objetoDeConexao.State == ConnectionState.Open)
{
return true;
}
}
catch(Exception ex)
{
throw new Exception(ex.Message)
}
}
44
Casa do Código Capítulo 4. Models: Desenhando os modelos da nossa aplicação
• Redução de código: como o acesso aos dados é feito em um nível mais alto,
automaticamente o número de linhas de código escritas para acessar os da-
dos reduz drasticamente. Você poderá constatar este fato na medida em que
avançamos com a criação da aplicação Cadê meu médico;
string stringDeConexao =
"string para conexão com o banco de dados aqui";
45
4.2. Abordagens para a criação de Models Casa do Código
Clientes.Add();
Clientes.NomeCompleto = NomeCompleto.Text;
Clientes.Email = Email.Text;
Clientes.Save();
46
Casa do Código Capítulo 4. Models: Desenhando os modelos da nossa aplicação
ção disponível e, também, por possuírem suporte. Em função disso, são amplamente
utilizados em projetos mundo afora.
Para a aplicação Cadê meu médico, utilizaremos o Entity Framework (EF), um
ORM distribuído gratuitamente pela Microsoft e que tem sido amplamente utilizado
em projetos .NET. Na ocasião em que este livro foi escrito, a versão estável mais atual
do EF era a 4.0.
Código primeiro?
Uma das vantagens proporcionadas por boa parte dos ORMs e propositalmente
não mencionada nas seção anterior é a possibilidade de escolher a forma de trabalho
do ORM. Isto é, vamos nos basear primeiro no banco de dados físico ou o banco
de dados que será gerado será um reflexo de nossa estrutura de classes? Nesta seção
discutiremos um pouco sobre as diferenças, vantagens e desvantagens entre estas
abordagens.
47
4.3. O Entity Framework Casa do Código
48
Casa do Código Capítulo 4. Models: Desenhando os modelos da nossa aplicação
Um bom exemplo para que possamos entender de forma clara e prática o funci-
onamento do mecanismo de code first com Entity Framework dentro da plataforma
.NET em projetos ASP.NET MVC é uma fração das funcionalidades de blog, ou seja,
posts e suas respectivas categorias. Desta forma, imaginando a estrutura mais simples
possível para este tipo de funcionalidade, poderemos ter a seguinte relação: uma ca-
tegoria pode possuir múltiplos posts enquanto um post pode estar atrelado a apenas
uma categoria.
Além da cardinalidade 1 para n configurada pela relação apresentada no pará-
grafo anterior, temos notoriamente visíveis duas entidades: Categorias e Posts.
Muito embora esta seja uma relação simples, ela nos possibilitará apresentar alguns
importantes recursos do framework MVC, além é claro, de apresentar o code first em
ação.
49
4.3. O Entity Framework Casa do Código
Uma classe com estrutura básica será automaticamente gerada pelo Visual
Studio. Substitua este conteúdo por aquele apresentado pela listagem 4.
50
Casa do Código Capítulo 4. Models: Desenhando os modelos da nossa aplicação
Como você pode perceber, a estrutura da classe é bem simples e dispensaria co-
mentários para um desenvolvedor com certa experiência no trato com ORM’s. En-
tretanto, é possível que as observações a seguir sejam úteis para você que não se
enquadra na situação apresentada há pouco.
Para que a classe Categorias possa existir, é preciso que Posts também
exista. Desta forma, você pode conferir através da listagem 5 a estrutura da classe
Posts.
51
4.3. O Entity Framework Casa do Código
[ForeignKey("CategoriaID")]
public virtual Categorias Categorias { get; set;
}
52
Casa do Código Capítulo 4. Models: Desenhando os modelos da nossa aplicação
A classe de contexto a qual nos referimos foi criada nos mesmos moldes das
demais apresentadas até aqui. Em se tratando de modelos de dados, evidentemente
está dentro do diretório Models.
Esta é a estrutura mais simplificada possível para a classe de contexto. Aqui
estamos “dizendo” ao EF, através das diretivas DbSet, que as classes Posts e
Categorias deverão ser criadas no banco de dados de destino.
Uma pergunta que naturalmente surge neste ponto é: “O banco de dados será
criado em qual servidor?”.
Esta é uma pergunta interessante e a resposta está diretamente atrelada ao mo-
delo de convenções do qual falamos no segundo capítulo. Por padrão, seguindo uma
convenção do EF e não do ASP.NET MVC, se nenhuma string de conexão com o ser-
vidor de destino for informada para o ORM, no momento da criação, o EF criará a
estrutura de banco de dados no SQL LocalDB ou Express Edition. Aquele que estiver
disponível — se ambos estiverem disponíveis, LocalDB será a escolha.
Se for preciso apontar a criação da estrutura de banco de dados para um
servidor específico, uma das possibilidades disponíveis para se realizar tal operação
é através da implementação de um método construtor na classe BlogContext. A
listagem 7 apresenta esta alteração.
53
4.3. O Entity Framework Casa do Código
54
Casa do Código Capítulo 4. Models: Desenhando os modelos da nossa aplicação
55
4.3. O Entity Framework Casa do Código
56
Casa do Código Capítulo 4. Models: Desenhando os modelos da nossa aplicação
Desafiando: que tal criar agora um modelo de classes do tipo “muitos para mui-
tos” via code first e, utilizando o recurso de scaffold, gerar operações de CRUD base-
ada nelas?
57
4.5. Banco de dados primeiro? Casa do Código
Listagem 4.8 - Script SQL que deu origem ao banco de dados da aplicação
’Cadê meu médico’:
USE CadeMeuMedicoBD
GO
58
Casa do Código Capítulo 4. Models: Desenhando os modelos da nossa aplicação
PRIMARY KEY(IDUsuario)
);
GO
PRIMARY KEY(IDMedico)
);
GO
PRIMARY KEY(IDEspecialidade)
);
GO
59
4.5. Banco de dados primeiro? Casa do Código
PRIMARY KEY(IDCidade)
);
GO
60
Casa do Código Capítulo 4. Models: Desenhando os modelos da nossa aplicação
Agora que já possuímos o banco de dados físico para a aplicação, estamos aptos
a dar o próximo passo, isto é, criar seu mapeamento via Entity Framework para que
a aplicação possa utilizá-lo. Para isso, adicionarei à pasta Models um novo tipo de
arquivo, chamado “ADO Entity Data Model”, conforme ilustra a figura 4.8.
61
4.5. Banco de dados primeiro? Casa do Código
62
Casa do Código Capítulo 4. Models: Desenhando os modelos da nossa aplicação
63
4.5. Banco de dados primeiro? Casa do Código
Ao clicar em OK você será levado de volta à tela anterior, mas agora, com a string
de conexão já selecionada. Basta nomear a variável que será salva (e posteriormente
referenciada) no arquivo Web.config da aplicação e prosseguir (ver figura 4.11).
64
Casa do Código Capítulo 4. Models: Desenhando os modelos da nossa aplicação
A próxima tela solicitará que você selecione os objetos do banco de dados que
serão mapeados. Em nosso caso, selecionaremos todas as tabelas, conforme sugere
a figura 4.12. Você também deverá nomear o namespace ao qual estão agrupados os
arquivos do modelo. Utilizaremos o nome CadeMeuMedicoBDModel. Após isso,
clique em “Finish”.
65
4.5. Banco de dados primeiro? Casa do Código
66
Casa do Código Capítulo 4. Models: Desenhando os modelos da nossa aplicação
67
4.5. Banco de dados primeiro? Casa do Código
Outra mudança que pode ser percebida na estrutura da aplicação, mas que não
é visível através da solution explorer, é a adição da string de conexão no arquivo
Web.config, conforme ilustra a listagem 9.
<connectionStrings>
<add name="EntidadesCadeMeuMedicoBD"
connectionString="metadata=res://*/Models.ModeloDeDados.csdl|
res://*/Models.ModeloDeDados.ssdl|
res://*/Models.ModeloDeDados.msl;provider=System.Data.SqlClient;
provider connection string="
data source=.\SQLEXPRESS;initial catalog=CadeMeuMedicoBD;
integrated security=True;
MultipleActiveResultSets=True;App=EntityFramework""
providerName="System.Data.EntityClient" />
</connectionStrings>
Pronto. Neste momento, temos tudo o que precisamos para conseguir trabalhar
com o banco de dados tendo como foco o modelo recém-gerado. Para este capítulo,
já reunimos toda informação necessária para seguir com os próximos passos. À me-
dida que a aplicação for ganhando forma, você entenderá como se dá o processo de
interação com o modelo que criamos aqui.
68
Casa do Código Capítulo 4. Models: Desenhando os modelos da nossa aplicação
• Código limpo: a criação das classes POCO ajudam a manter o código limpo,
69
4.6. Model first x Code first: Quando utilizar um ou outro? Casa do Código
• Simplicidade: de forma geral, o trabalho com code first tende a ser mais sim-
ples. Isso porque não existe a necessidade de se manter um arquivo .edmx.
Qualquer problema gerado neste arquivo implicará necessariamente em pro-
blemas com a engine de acesso a dados.
Mas nem tudo são flores. Code first possui um “problema” intrínseco, proveni-
ente do seu esquema de trabalho que limita sua utilização em boa parte dos projetos:
de forma geral, ele pode ser aplicado apenas a novos projetos, já que, dependendo
da complexidade do banco de dados de aplicações já existentes, fica inviável gerar
classes POCO manualmente para obter a equivalência no banco de dados físico.
Dica: Se um novo projeto for seu objeto de estudo, considere utilizar o modelo
code first. Os resultados deste tipo de abordagem para esta natureza de projeto cos-
tumam render excelentes frutos.
70
Casa do Código Capítulo 4. Models: Desenhando os modelos da nossa aplicação
71
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 recurso Partial Class ou Classes Parciais, va-
mos vincular a classe de metadado com a classe criada automaticamente.
Classes Parciais
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 tipo Class, e defina o nome da classe igual a
MedicoMetadado. A figura 4.15 representa esse processo.
72
Casa do Código Capítulo 4. Models: Desenhando os modelos da nossa aplicação
namespace CadeMeuMedico.Models
{
73
4.7. Adicionando atributos de validação nos modelos Casa do Código
[MetadataType(typeof(MedicoMetadado))]
public partial class Medico
{
74
Casa do Código Capítulo 4. Models: Desenhando os modelos da nossa aplicação
máximo 80 caracteres")]
public string WebsiteBlog { 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ó o model Medico — 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.
75
Capítulo 5
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).
5.1. Vamos ‘controlar’ a aplicação? Casa do Código
• Actions que podem não dar origem a views mas que são muito importantes.
78
Casa do Código Capítulo 5. Controllers: Adicionando comportamento a nossa aplicação
Em termos técnicos, um controller nada mais é do que uma classe que herda
comportamentos de outra (a saber, Controller) disponível na BCL. Cada método
disponível nesta classe especial é chamado de Action. As Actions são, efetivamente,
a menor unidade de ação dentro de um controller. São elas que encapsulam os com-
portamentos que são invocados a todo momento, pela classe controladora.
• http://localhost/mensagens/bomdia
• http://localhost/mensagens/boatarde
79
5.2. Entendendo o papel dos Controllers e Actions Casa do Código
campo Template, a opção Empty MVC controller. Ao final. a janela com os valores
configurados deve estar parecida com a apresentada pela figura 5.1.
Após isso, você notará que o Visual Studio abrirá o arquivo recém-criado e
que no interior de nosso controller MensagensController uma action chamada
index já estará criada. Assim, seu controller deverá estar parecido com o apresen-
tado pela listagem 1.
80
Casa do Código Capítulo 5. Controllers: Adicionando comportamento a nossa aplicação
O que faremos agora é excluir a action index predefinida e criar novas duas
novas, chamadas BomDia e BoaTarde respectivamente. Os códigos que compõem
tais actions deverão apresentar alguma informação para o usuário. Estas serão as
funções de ambas.
Não se preocupe, o tipo de retorno ActionResult e a diretiva de retorno
Content que utilizaremos em nossos exemplos serão discutidas em maiores deta-
lhes à medida que avançamos neste capítulo.
A listagem 2 apresenta o código das actions que executarão as tarefas que
o usuário final solicitará e que você deverá adicionar ao seu controller para a
visualização do exemplo.
Pronto. Nosso projeto já pode ser executado. Compile-o utilizando a tecla F5.
Seu navegador padrão será trazido à execução e irá apresentar uma mensagem de
erro dizendo que “Não foi possível encontrar o recurso”. Muito embora a mensagem
de erro seja emitida, ela já era esperada. Isso acontece porque ainda não criamos o
controller padrão configurado no roteamento do nosso projeto.
Neste momento, para que você possa visualizar o exemplo em execução, descon-
sidere a mensagem de erro e, na barra de endereço de seu navegador, complete a URL
apresentada com os valores /mensagens/bomdia ou /mensagens/boatarde.
Perceba que estamos solicitando especificamente um /{controller}/{action}
e, com isso, o MVC faz o roteamento para o controller e action que solicitamos e que
podem ser aplicados.
81
5.2. Entendendo o papel dos Controllers e Actions Casa do Código
Veja através da figura 5.2 um exemplo de uma mensagem sendo exibida ao usuá-
rio.
82
Casa do Código Capítulo 5. Controllers: Adicionando comportamento a nossa aplicação
Agora que você já foi apresentado aos conceitos iniciais relacionados aos control-
lers, é chegado o momento de voltar as atenções para nossa aplicação de exemplo.
Isso será feito na próxima seção.
83
5.4. Cadê meu médico: CRUDs Casa do Código
Para que todas essas ações possam ser implementadas, criaremos CRUDs para
cada um dos elementos da aplicação Cadê meu médico (você se lembra: Usuários,
Médicos, Especialidades e Cidades).
84
Casa do Código Capítulo 5. Controllers: Adicionando comportamento a nossa aplicação
85
5.4. Cadê meu médico: CRUDs Casa do Código
aplicação foram criados utilizando Entity Framework e é através dele que obteremos
a lista de médicos já cadastrados para que, em um momento posterior, possamos
enviá-los para a view.
Evoluir é preciso, assim, continuando a construção do MedicosController,
precisamos agora criar uma instância do objeto EntidadesCadeMeuMedicoBD
que possibilitará todo o trabalho de comunicação dos nossos modelos (mo-
dels) com o banco de dados da aplicação. Lembre-se de adicionar o namespace
CadeMeuMedico.Models nos usings do controller MedicosController. Com a
instância do contexto de entidades do Entity Framework criada, podemos na action
Index obter uma lista com todos os Médicos cadastrados e, no instante seguinte,
passar estes dados para a view. A listagem 4 representa isso.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using CadeMeuMedico.Models;
namespace CadeMeuMedico.Controllers
{
public class MedicosController : Controller
{
private EntidadesCadeMeuMedicoBD db =
new EntidadesCadeMeuMedicoBD();
86
Casa do Código Capítulo 5. Controllers: Adicionando comportamento a nossa aplicação
• Create a strongly-typed view: marque essa opção pois, através dela, criaremos
uma view fortemente tipada, fato que facilitará nosso trabalho, permitindo a
utilização direta do model na view;
• Model class: selecione o model que servirá de base para a criação da view. Nesse
caso, sua opção deve ser por “Medico";
• Scaffold template: define qual template de view será criado. Neste caso, seleci-
one a opção List. Como consequência, o MVC criará automaticamente uma
view com uma tabela pronta para demonstrar os registros existentes;
• Reference script libraries: desmarque essa opção. Toda referência de script ne-
cessária para o funcionamento do aplicativo foi realizada na Master Page;
87
5.4. Cadê meu médico: CRUDs Casa do Código
• Use a layout master page: essa opção deve ser selecionada para criar uma view
que utilize a Master Page já definida anteriormente.
A figura 5.5 representa esse processo. Todas as views criadas no aplicativo a partir
de agora seguirão este template, onde alteraremos somente as propriedades de model
class e Scaffold template.
Após clicar no botão Add, o Visual Studio criará e automaticamente abrirá a view
para edição. A listagem 5 apresenta o código gerado para a view Index.
O próximo capítulo será dedicado integralmente à apresentação de detalhes
relacionados às views e à sua engine padrão — o ASP.NET Razor. Não se preocupe
88
Casa do Código Capítulo 5. Controllers: Adicionando comportamento a nossa aplicação
@model IEnumerable<CadeMeuMedico.Models.Medico>
@{
ViewBag.Title = %%Index%%;
}
<h2>Index</h2>
<p>
@Html.ActionLink("Create New", "Create")
</p>
<table>
<tr>
<th>
@Html.DisplayNameFor(model => model.IDMedico)
</th>
<th>
@Html.DisplayNameFor(model => model.CRM)
</th>
<th>
@Html.DisplayNameFor(model => model.Nome)
</th>
<th>
@Html.DisplayNameFor(model => model.Endereco)
</th>
<th>
@Html.DisplayNameFor(model => model.Bairro)
</th>
<th>
@Html.DisplayNameFor(model => model.Email)
</th>
<th>
@Html.DisplayNameFor(model => model.AtendePorConvenio)
</th>
<th>
@Html.DisplayNameFor(model => model.TemClinica)
89
5.4. Cadê meu médico: CRUDs Casa do Código
</th>
<th>
@Html.DisplayNameFor(model => model.WebsiteBlog)
</th>
<th>
@Html.DisplayNameFor(model => model.IDCidade)
</th>
<th>
@Html.DisplayNameFor(model => model.IDEspecialidade)
</th>
<th></th>
</tr>
90
Casa do Código Capítulo 5. Controllers: Adicionando comportamento a nossa aplicação
</td>
<td>
@Html.DisplayFor(modelItem => item.IDCidade)
</td>
<td>
@Html.DisplayFor(modelItem => item.IDEspecialidade)
</td>
<td>
@Html.ActionLink("Edit", "Edit",
new { /* id=item.PrimaryKey */ }) |
@Html.ActionLink("Details", "Details",
new { /* id=item.PrimaryKey */ }) |
@Html.ActionLink("Delete", "Delete",
new { /* id=item.PrimaryKey */ })
</td>
</tr>
}
</table>
Por padrão, o scaffold do MVC cria uma tabela com uma coluna para cada pro-
priedade do modelo, nesse caso, temos um grid que irá mostrar todos os dados dos
médicos. No caso da aplicação Cadê meu Médico, os dados que deveremos mostrar
no grid devem ser apenas: Nome, Cidade e Especialidade.
Modifique o código da view Index removendo as colunas desnecessárias, man-
tendo somente as colunas para Nome, Cidade e Especialidade. A listagem 6 apre-
senta o código esperado. Repare também que, nas colunas Cidade e Especialidade,
modificamos o valor apresentado. Originalmente o scaffold adicionou as proprieda-
des IDEspecialidade e IDCidade, o que para o usuário não faz sentido — para ele a
informação necessária é o nome referente a essas informações.
Na listagem 4 utilizamos o recurso .Include() do EntityFramework para
carregar os relacionamentos do modelo, com isso fica fácil navegar entre os relacio-
namentos do modelo e apresentar outras informações ao usuário.
@{
ViewBag.Title = %%Index%%;
91
5.4. Cadê meu médico: CRUDs Casa do Código
<h2>Index</h2>
<p>
@Html.ActionLink("Create New", "Create")
</p>
<table>
<tr>
<th>
@Html.DisplayNameFor(model => model.Nome)
</th>
<th>
@Html.DisplayNameFor(model => model.IDCidade)
</th>
<th>
@Html.DisplayNameFor(model => model.IDEspecialidade)
</th>
<th></th>
</tr>
92
Casa do Código Capítulo 5. Controllers: Adicionando comportamento a nossa aplicação
</table>
Agora sim. Ao compilar o projeto, você verá que a aplicação exibe um item de
menu chamado Médicos. Ao clicar no menu, você será redirecionado para a URL
/medicos. Evidentemente, nenhum médico será exibido na página, uma vez que
não adicionamos médicos ainda. O importante aqui é notar que já é possível ver o
título da página, um link para criar novos médicos e o cabeçalho da tabela (grid). A
figura 5.6 demonstra a página em execução.
93
5.4. Cadê meu médico: CRUDs Casa do Código
94
Casa do Código Capítulo 5. Controllers: Adicionando comportamento a nossa aplicação
Da mesma forma que fizemos para adicionar a view Index, faremos também
para criar a view Adicionar, com a diferença, entretanto, de que agora escolhere-
mos o template Create.
Após efetuar a criação, o Visual Studio abrirá automaticamente o arquivo da
view. Seu código deverá estar parecido com aquele apresentado pela listagem 9.
Note que, no lugar de uma tabela para listar registros já cadastrados, o template
Create gerou um formulário para o preenchimento dos dados do model.
@model CadeMeuMedico.Models.Medico
@{
ViewBag.Title = "Adicionar";
}
<h2>Adicionar</h2>
@using (Html.BeginForm()) {
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
<fieldset>
<legend>Medico</legend>
95
5.4. Cadê meu médico: CRUDs Casa do Código
<div class="editor-label">
@Html.LabelFor(model => model.IDMedico)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.IDMedico)
@Html.ValidationMessageFor(model => model.IDMedico)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.CRM)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.CRM)
@Html.ValidationMessageFor(model => model.CRM)
</div>
<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.Endereco)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Endereco)
@Html.ValidationMessageFor(model => model.Endereco)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.Bairro)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Bairro)
@Html.ValidationMessageFor(model => model.Bairro)
</div>
96
Casa do Código Capítulo 5. Controllers: Adicionando comportamento a nossa aplicação
<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>
<div class="editor-label">
@Html.LabelFor(model => model.AtendePorConvenio)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.AtendePorConvenio)
@Html.ValidationMessageFor(model =>
model.AtendePorConvenio)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.TemClinica)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.TemClinica)
@Html.ValidationMessageFor(model => model.TemClinica)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.WebsiteBlog)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.WebsiteBlog)
@Html.ValidationMessageFor(model => model.WebsiteBlog)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.IDCidade)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.IDCidade)
@Html.ValidationMessageFor(model => model.IDCidade)
</div>
97
5.4. Cadê meu médico: CRUDs Casa do Código
<div class="editor-label">
@Html.LabelFor(model => model.IDEspecialidade)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.IDEspecialidade)
@Html.ValidationMessageFor(model => model.IDEspecialidade)
</div>
<p>
<input type="submit" value="Create" />
</p>
</fieldset>
}
<div>
@Html.ActionLink("Back to List", %%Index%%)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.IDMedico)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.IDMedico)
@Html.ValidationMessageFor(model => model.IDMedico)
</div>
98
Casa do Código Capítulo 5. Controllers: Adicionando comportamento a nossa aplicação
[HttpPost]
public ActionResult Adicionar(Medico medico)
{
if (ModelState.IsValid)
{
db.Medicos.Add(medico);
db.SaveChanges();
return RedirectToAction(%%Index%%);
}
99
5.4. Cadê meu médico: CRUDs Casa do Código
O atributo HttpPost na action diz ao framework MVC qual action ele deve exe-
cutar quando a requisição HTTP possuir o verbo POST. Isso é necessário porque a
URL /Medicos/Adicionar é utilizada para mostrar o formulário e também para
enviar os dados preenchidos. O que muda nas requisições são os verbos executados
e os valores enviados para o servidor.
A listagem 11 também possui a action que será executada quando a requisição
possuir o verbo GET e é ela quem retorna a página com o formulário. Apesar de o
atributo HttpGet existir, ele não precisa ser adicionado porque actions sem atributo,
por convenção, são consideradas HttpGet.
Estamos quase prontos para testar nosso primeiro cadastro. Antes porém, pre-
cisamos fazer uma pequena alteração no arquivo “Index.cshtml” que está na pasta
Views > Medicos da Solution Explorer. O framework MVC cria todos os templates
utilizando o idioma inglês. Assim, por inércia, ele sempre irá criar links apontando
para actions Create, Edit, Delete. Como você deve se lembrar, substituímos Create
por Adicionar. Assim, precisamos substituir na view as chamadas para Create
por Adicionar.
No arquivo Index.cshtml, encontre o código
@Html.ActionLink("Create New", "Create") e troque por
@Html.ActionLink("Adicionar novo médico", "Adicionar"). O
que estamos fazendo é trocar o texto do link: e em vez de ele apontar para a action
Create, agora aponta para action Adicionar.
Compile seu projeto, navegue até a página de Países, e clique no botão Adicionar
novo médico. A página /Medicos/Adicionar será carregada; informe só o nome
do médico e clique no botão Create. A figura 5.7 representa esse processo.
100
Casa do Código Capítulo 5. Controllers: Adicionando comportamento a nossa aplicação
O médico não será adicionado, já que campos obrigatórios não foram informa-
dos. Lembre-se que no capítulo sobre os models adicionamos atributos de validação
nas propriedades das entidades. Nesse momento, os atributos estão sendo utiliza-
dos pelo MVC para fazer automaticamente a validação dos dados informados no
formulário. Essa validação é feita pela linha “if (ModelState.IsValid)” da listagem 11.
No caso de um modelo válido, o Entity Framework adicionará o mesmo ao banco
de dados. Caso algum problema seja encontrado na validação do modelo, a view será
101
5.4. Cadê meu médico: CRUDs Casa do Código
Listagem 5.12 -
:
return View(medico);
}
[HttpPost]
public ActionResult Editar(Medico medico)
{
if (ModelState.IsValid)
{
db.Entry(medico).State = EntityState.Modified;
102
Casa do Código Capítulo 5. Controllers: Adicionando comportamento a nossa aplicação
db.SaveChanges();
return RedirectToAction(%%Index%%);
}
ViewBag.IDCidade = new SelectList(db.Cidades, "IDCidade",
"Nome",
medico.IDCidade);
ViewBag.IDEspecialidade = new SelectList(db.Especialidades,
"IDEspecialidade",
"Nome",
medico.IDEspecialidade);
return View(medico);
}
Após a criação das actions e da view Editar, só nos resta realizar mais uma alte-
ração. Ela precisa ser feita na view Index. Cada linha da tabela que representa um
médico cadastrado possui um link para sua Edição e Exclusão. Vamos primeiro alte-
rar a criação do link para edição. Altere o código @Html.ActionLink("Edit",
"Edit", new { /* id=item.PrimaryKey */ }) para o código correto que
direciona para a action Editar: @Html.ActionLink("Editar", "Editar",
new { id=item.IDMedico }).
Feito isso, compile sua aplicação e teste a alteração do registro recém-criado.
Para finalizar as operações do cadastro de Médicos, só resta a criação da action
para a exclusão dos registros. A listagem 13 representa o código da action Excluir.
O código é mais simples do que os apresentados anteriormente: a action retorna
true ou false de acordo com o resultado da exclusão. Esses valores serão utilizados
no próximo capítulo, assim como a chamada para a action Excluir que será feita
por Ajax no capítulo sobre Views.
Listagem 5.13 -
:
[HttpPost]
public string Excluir(long id)
{
try
{
Medico medico = db.Medicos.Find(id);
db.Medicos.Remove(medico);
db.SaveChanges();
103
5.4. Cadê meu médico: CRUDs Casa do Código
return Boolean.TrueString;
}
catch
{
return Boolean.FalseString;
}
}
Vimos até aqui as operações para o cadastro de médicos. Utilize o que foi apre-
sentado até o momento para criar também os cadastros de Cidades e Especialidades.
Aproveite também para traduzir os elementos criados em inglês pelo MVC nas Views
autogeradas. A partir de agora veremos com mais detalhes os recursos disponíveis
nas views do MVC.
104
Capítulo 6
6.1 Visões?!
Visões (ou como a grande maioria dos desenvolvedores prefere chamar — views) são
os elementos que constituem a “ponta externa do iceberg” nas aplicações ASP.NET
MVC. A associação é pertinente, uma vez que são os ponteiros das tais estruturas
de gelo que podem ser vistas a olho nu sem que se quer possa imaginar a complexa
estrutura que há por debaixo d’água. O mesmo ocorre com as views em aplicações
ASP.NET MVC.
Como já mencionamos anteriormente neste livro, o principal objetivo do fra-
mework MVC é separar responsabilidades. Assim, temos basicamente três camadas,
sendo que uma delas (as views) são dedicadas exclusivamente à exibição de informa-
ções ao usuário final. Não há processamento a nível de servidor nesta camada, já que,
para isso, temos os controllers. De igual forma, acessos a dados não devem ser reali-
zados nesta camada, uma vez que possuímos os models para tal. Assim, resta a view
receber massas de dados já prontas e simplesmente exibi-las. A figura 6.1 apresenta
o fluxo de operação até a view.
Figura 6.1: O fluxo de operação do framework MVC até a view. Fonte: http://www.
arrangeactassert.com/
106
Casa do Código Capítulo 6. Views: interagindo com o usuário
engine o mecanismo interno da plataforma (em nosso caso, ASP.NET) que possibilita
a transformação de diretivas exclusivamente de servidor em código HTML, legível
pelo navegador, ainda no container web para posterior exibição ao usuário final.
A ideia fundamental neste caso é a de proporcionar ao desenvolvedor o alto po-
der programático oferecido pelas linguagens de servidor — como as tags dos com-
ponentes de servidor do ASP.NET, por exemplo — e passar a responsabilidade de
geração do código objeto no browser para o container web.
107
6.5. Diferenças na prática Casa do Código
Dentre estas novidades, aquela que recebeu maior destaque e que contribuiu em
grande escala para a adoção do framework, foi a introdução da nova view engine —
a ASP.NET Razor.
Diferentemente do que você pode estar pensando, ASP.NET Razor não é uma
linguagem de programação. É, sim, uma nova forma de estruturar views que preci-
sam de alguma porção de código processada no servidor de aplicação.
Costuma-se dizer que Razor é um modelo de escrita de código por não possuir
uma linguagem predefinida. É possível utilizar o modelo de programação ofere-
cido pelo Razor utilizando as duas principais linguagens da .NET framework: C#
ou VB. No caso, arquivos Razor estruturados com base em C# possuem a extensão
“*.cshtml”, enquanto arquivos estruturados com base em VB possuem a extensão
“*.vbhtml”.
Como você já pôde perceber, em projetos ASP.NET MVC, as views possuem a
função de exibir dados processados pelos controllers. Capturar valores provenientes
destes dos controllers é uma tarefa amplamente simplificada pelo Razor.
108
Casa do Código Capítulo 6. Views: interagindo com o usuário
@item.ValorUnitario
</span>
}
Estes trechos de códigos são decisivos para apresentarmos algumas conceitos ini-
ciais importantes acerca da view engine Razor. A primeira observação pertinente em
relação às abordagens é a diferença que demarca os blocos de código. Enquanto views
que utilizam ASPX utilizam delimitadores “<% %>”, Razor utiliza apenas a marcação
de “@”. Outra observação (não menos importante) é que o motor de renderização
do Razor é “inteligente”. Perceba que, enquanto ASPX tem uma separação explícita
entre suas tags e as HTML, Razor não a possui. Isso ocorre porque o motor de rende-
rização do Razor separa de forma automática HTML de código C# (ou Visual Basic
que também é suportado, é importante que se diga).
Evidentemente, esta não é a única forma de se escrever código Razor. Existem
casos em que blocos de instruções devem ser agrupado em blocos maiores (multili-
nhas) para se conseguir uma melhor organização do código na view, por exemplo.
Para estes casos, poderíamos utilizar uma abordagem conhecida como “Bloco de
múltiplas linhas”. Caso uma linha seja suficiente para expressar um comportamento
através do Razor, o método conhecido como “inline” pode ser utilizado. A listagem
3 apresenta a diferença entre as abordagens.
@{
//Multi-linhas
ViewBag.Title = "Teste de layout";
var Data = DateTime.Now.DayOfWeek;
string StringConcatenada = "Hoje é '" + Data.ToString()
+ "'. Seja bem vindo(a)!";
}
109
6.6. Helpers?! Casa do Código
@{
ViewBag.Title = "Teste de layout";
var Data = DateTime.Now.DayOfWeek;
string StringConcatenada = Data.ToString();
}
6.6 Helpers?!
Não há dúvidas entre aqueles que utilizam Razor em seu dia a dia quanto à utilidade
dos helpers no contexto das aplicações.
A criação de helpers é um recurso que se encontra disponível no contexto do
ASP.NET Razor desde a primeira versão. Inicialmente, Razor permitia que os helpers
apenas retornassem strings para as views. Felizmente, esta realidade mudou e, hoje,
podemos criar helpers que retornam porções e HTML com objetos atrelados. Isso dá
ao desenvolvedor maior poder e, consequentemente, maior robustez às views.
De forma direta, são os helpers que permitem criar operações e comportamen-
tos específicos que poderão ser reutilizados ao longo de toda a aplicação. Considere
110
Casa do Código Capítulo 6. Views: interagindo com o usuário
novamente nosso projeto “Cadê meu médico”. Imagine, por exemplo, que quere-
mos exibir ao longo de toda a aplicação um box de publicidade, onde exibiremos os
dois banners mais recentes. Com o objetivo de desacoplar os componentes da view e
reutilizar em outras aplicações, inclusive, poderíamos criar um helper “BannersPu-
blicitarios”.
Antes de criarmos nosso helper de exemplo, é importante saber que existem dois
modelos para a criação de helpers. A saber, na própria view onde ele será utilizado
ou de forma que ele possa ser reaproveitado ao longo de múltiplas views. Como o
objetivo principal dos helpers é servir como mecanismo de refactoring de códigos na
view, apresentaremos no exemplo a seguir apenas a segunda abordagem.
111
6.6. Helpers?! Casa do Código
Antes de irmos aos códigos, relembremos: o que faremos aqui é um painel que
exibe banners publicitários. Para que isto possa ser dinâmico, adicionarei uma nova
tabela ao nosso banco de dados chamada “BannersPublicitarios” e a preencherei com
dois registros: um para “Conio Soluções em Tecnologia” com sua respectiva imagem
e outro “Casa do Código” também com sua imagem. Só então partiremos para a
codificação de nosso helper.
O SQL para a criação da tabela e os respectivos insert’s são apresentados pela
listagem 5.
PRIMARY KEY(IDBanner)
);
112
Casa do Código Capítulo 6. Views: interagindo com o usuário
@using CadeMeuMedico.Models;
@helper RetornaDoisBannersMaisRecentes() {
@foreach(var b in banners) {
<div style="width:125px; height:125px;
float:left; margin-right:10px;">
<a href="@b.LinkBanner">
<img src="~/Uploads/Banners/@b.BannerCampanha"
title="@b.TituloCampanha" />
</a>
</div>
}
113
6.6. Helpers?! Casa do Código
</div>
@BannersPublicitarios.RetornaDoisBannersMaisRecentes();
Note que a chamada é simples de ser realizada. Basta informar o nome do ar-
quivo helper (no caso “BannersPublicitarios”) e, na sequência, invocar o método
“RetornaDoisBannersMaisRecentes()”. Isso automaticamente nos diz que um helper
pode implementar vários métodos. Em nosso exemplo, poderíamos ter tranquila-
mente, um segundo método chamado “RetornaSeisBannersMaisRecentes()” etc. O
resultado gerado pela implementação deste helper pode ser visualizado através da
figura 6.3.
114
Casa do Código Capítulo 6. Views: interagindo com o usuário
Helpers nativos
Ainda sobre os helpers, é importante notar o seguinte: existem aqueles perso-
nalizados (criados sob demanda, a exemplo do que fizemos no tópico anterior) e
existem os helpers nativos do framework, que podem ser utilizados para otimizar al-
gumas operações com views. Você já está em contato com eles desde o início deste
livro e talvez ainda não saiba. Para exemplificar sua utilização e importância, vamos
considerar novamente a listagem 5.
Se você é um bom observador, por certo percebeu que o formulá-
rio foi gerado basicamente através de um componente “@Html”. @Html
115
6.6. Helpers?! Casa do Código
De forma geral, o preço a se pagar pelo uso excessivo de helpers nas views é a sin-
gela perda de desempenho, uma vez que, ao fazê-lo, colocamos uma camada a mais
de processamento sobre o processo de renderização (lembre-se, Razor é processado
no servidor).
Este tipo de helper pode ainda ser estendido (sim, você pode criar suas extensões)
através dos extension methods, recurso disponível no .NET framework desde a versão
3.5. Você pode encontrar uma boa leitura acerca disso através deste link (em inglês):
http://bit.ly/15Zr9cs.
Vale mencionar, ainda, que existe uma grande quantidade de helpers já prontos,
que realizam diferentes tarefas, disponíveis de forma gratuita no repositório público
do NuGet. Dentre os mais baixados, podemos citar: integração com Twitter (a.k.a.,
Twitter.Goodies), Facebook, PayPal e Amazon. O processo de instalação destes hel-
pers já é conhecido por você, uma vez que segue o mesmo padrão imposto pelo “Li-
brary Package Manager” (NuGet) do Visual Studio, apresentado nos capítulos inici-
ais do livro.
116
Casa do Código Capítulo 6. Views: interagindo com o usuário
Para invocá-lo, você deverá seguir o mesmo padrão apresentado por nós no
exemplo da criação e utilização do helper “BannersPublicitarios”. Aliás, este é um
bom momento para treinar! Vá até o repositório do NuGet através do Visual Studio,
busque pelo helper “Twitter.Goodies” e instale-o. Isso feito, adicione-o a uma view
qualquer do projeto de exemplo e veja o resultado “mágico” da integração.
117
6.7. Algumas outras vantagens Casa do Código
Renderizações parciais
Quando iniciamos a criação da aplicação “Cadê meu médico?”, como você deve
se lembrar, uma de nossas primeiras providências foi a de criar a página mestra, co-
nhecida entre os programadores/designers como master page. Esta página foi criada
com o objetivo de servir de padrão visual para todas as demais views, que carrega-
riam seus conteúdos dentro de uma área especifica da master page. A diretiva que
possibilitou a realização desta mágica foi a “@RenderBody()”. Certo?!
No sentido de desacoplar ainda mais a master page (você se lembra da história
do “dividir pra conquistar"?), encontra-se disponível nas view engines da Microsoft
um recurso conhecido como “renderizações parciais”.
A ideia com este recurso é que você renderize porções específicas de código em
pontos distintos da master page. Imagine, por exemplo, que seja importante que o
menu da aplicação seja carregado de forma assíncrona enquanto o restante da view
seja carregado no primeiro post.
Você poderia utilizar a diretiva “@RenderSection()” ou “@RenderPartial()” para
buscar uma view parcial que carrega (de forma assíncrona com jQuery, por exemplo)
seu menu. A utilização de “@RenderPartial()” já foi demonstrada neste livro, no
capítulo 3. A diferença básica de “@RenderPartial” para “@RenderSection” é que a
primeira tem o poder de renderizar uma view parcial completa, e a segunda renderiza
seções especificas. Para “@RenderPartial”, você deverá especificar a view parcial que
será renderizada naquele ponto.
Agregação e minificação
Nos dias atuais é comum que uma aplicação web possua milhares de linhas de
código JavaScript, CSS, XML e afins. Diariamente nos cercamos de plugins para oti-
mizar tarefas e proporcionar ao usuário final maior responsividade.
É claro que, quanto maior é a quantidade de código desta natureza em uma apli-
cação, invariavelmente, mais comprometida estará a performance das páginas. Desta
forma, novamente a Microsoft propôs um recurso interessante para minimizar este
problema: trata-se da agregação e minificação.
Já que para realizar a renderização os motores realizam a verificação do arquivo
fonte, linha a linha, a ideia básica é que o próprio servidor de aplicação seja capaz
de realizar, em tempo de execução, a remoção daquilo que pode ser desprezado sem
118
Casa do Código Capítulo 6. Views: interagindo com o usuário
No modelo de web page tradicional, para que estes arquivos possam entrar
em atividade é preciso que haja uma referência manual para cada um deles, como
ilustrado através da listagem 8.
119
6.8. Mobilidade: Sua consulta de médicos em dispositivos móveis Casa do Código
Quando a view Razor ou ASPX encontrar este modelo de referência, o que ela
(framework) fará é verificar todos os arquivos CSS dentro do diretório apontado
(neste caso “styles”), combiná-los, minificá-los e, na sequência, devolver uma res-
posta HTTP de um único arquivo CSS. Assim, ao invés de seis chamadas serem re-
alizadas junto ao servidor, este número cai para apenas uma chamada. Legal, não?!
120
Casa do Código Capítulo 6. Views: interagindo com o usuário
121
6.8. Mobilidade: Sua consulta de médicos em dispositivos móveis Casa do Código
122
Casa do Código Capítulo 6. Views: interagindo com o usuário
• Criar áreas separadas para projetos mobile e projetos desktop. Este é o mo-
delo onde a separação de camadas é mais definitiva. Existem diferentes pro-
jetos, mobile e desktop (com diferentes controllers, actions e views) em uma
mesma solução. Ao receber a solicitação, o framework identifica a resolução
do dispositivo e direciona o fluxo de operação para o projeto adequado na
solução.
Para que esta ideia possa ficar mais clara, vamos a alguns exemplos práticos.
Imagine que para a aplicação “Cadê meu médico?”, escolhêssemos a primeira
abordagem apresentada pela lista anterior. Para que a aplicação seja capaz de
renderizar o layout correto (claro, imaginando que exista um layout chamado
“_LayoutMobile.cshtml”) bastaria escrever o código apresentado pela listagem 11 no
interior do arquivo “_ViewStart.cshtml”.
@{
Layout = Request.Browser.IsMobileDevice ?
"~/Views/Shared/_LayoutMobile.cshtml"
: "~/Views/Shared/_Layout.cshtml";
}
123
6.8. Mobilidade: Sua consulta de médicos em dispositivos móveis Casa do Código
if (request.Browser.IsMobileDevice)
{
result = base.FindView(controllerContext, "Mobile/" +
viewName, masterName, useCache);
}
return result;
}
}
É claro que o código acima apresenta apenas uma ideia do que se pode fazer. Este
tipo de operação pode ser implementada, por exemplo, em um controller base de sua
aplicação (que herde de controller).
Escolhendo a terceira opção, poderíamos criar uma área específica para uma
aplicação móvel dentro de nosso projeto. Para isso, bastaria clicar com o botão direito
sobre ele e clicar na opção Add > Area (nos moldes do que já fizemos durante todo
o livro).
No interior dessa área podemos adicionar controllers e views normalmente,
como se fosse um projeto à parte. Assim, para fins didáticos, podemos adicionar
um controller “HomeController” dentro da nova área. Este controller poderá atuar
como o novo controlador padrão da aplicação em dispositivos móveis. Bastaria,
124
Casa do Código Capítulo 6. Views: interagindo com o usuário
após isso, realizar dois pequenos ajustes no padrão rotas da aplicação (através dos
arquivos “RouteConfig.cs”), para garantir que tal controller poderá ser alcançado.
Estes ajustes podem ser visualizados na listagem 13.
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new { controller = "Home", action = "Index",
id = UrlParameter.Optional },
// Adicione o namespace dos controladores desktop a seguir
new[] { "CadeMeuMedico.Controllers" }
);
}
125
6.8. Mobilidade: Sua consulta de médicos em dispositivos móveis Casa do Código
Concluindo e desafiando
Neste capítulo apresentamos todos os principais conceitos para que você possa
ampliar seus conhecimentos em relação à maneira com que o framework MVC trata
o mecanismo de views. Apresentamos também importantes conceitos acerca do
ASP.NET Razor, view engine padrão da Microsoft para projetos web. Finalmente
concluímos apresentando conceitos de mobilidade dentro do ASP.NET MVC.
Fica como desafio para este capítulo reproduzir na prática qualquer um dos três
mecanismos de mobilidade nativos do ASP.NET MVC mencionados aqui. Dica: nós
recomendamos o terceiro modelo.
126
Capítulo 7
128
Casa do Código Capítulo 7. Segurança: Criando sua área administrativa
HashPasswordForStoringInConfigFile(Senha, "sha1");
try
{
using (EntidadesCadeMeuMedicoBD db =
new EntidadesCadeMeuMedicoBD())
{
var QueryAutenticaUsuarios =
db.Usuarios.
Where(x => x.Login == Login && x.Senha == Senha).
SingleOrDefault();
if (QueryAutenticaUsuarios == null)
{
return false;
}
else
{
RepositorioCookies.RegistraCookieAutenticacao(
QueryAutenticaUsuarios.IDUsuario);
return true;
}
}
}
catch (Exception)
{
return false;
}
}
129
7.2. Criando a área administrativa Casa do Código
130
Casa do Código Capítulo 7. Segurança: Criando sua área administrativa
ASP.NET MVC utiliza este sufixo para identificar de forma automática aquela classe
como controladora e automaticamente herdar os comportamentos da classe Control-
ler da BCL (Base Class Library). A figura 7.1 apresenta esta parametrização.
[HttpGet]
public JsonResult AutenticacaoDeUsuario(string Login, string Senha)
{
if (RepositorioUsuarios.AutenticarUsuario(Login, Senha))
{
return Json(new {
OK = true,
Mensagem = "Usuário autenticado. Redirecionando..." },
JsonRequestBehavior.AllowGet);
}
131
7.2. Criando a área administrativa Casa do Código
else
{
return Json(new {
OK = false,
Mensagem = "Usuário não encontrando. Tente novamente." },
JsonRequestBehavior.AllowGet);
}
}
A pergunta que pode ter se formado em sua cabeça neste instante é: a resposta
volta para quem? Veja, no caso da aplicação “Cadê meu médico?”, utilizaremos uma
chamada assíncrona com jQuery para disparar o processo de verificação da existên-
cia ou não do usuário, portanto, quem receberá a resposta final do controller será o
objeto jQuery que originou o processo. A partir daí, será simples exibir os dados
para o usuário final. Pois bem, já que possuímos a infraestrutura de backend pronta,
precisamos montar a estrutura de frontend.
Prosseguindo com o processo de criação de nossa área protegida, abra o arquivo
“HomeController” e em seu interior, adicione uma nova action que retorna um
ActionResult e, na sequência, nomeie-a como “Login”. A listagem 3 apresenta a
132
Casa do Código Capítulo 7. Segurança: Criando sua área administrativa
estrutura da mesma.
<!DOCTYPE html>
<html lang="pt-br">
<head>
<meta name="viewport" content="width=device-width" />
<title>Cade meu medico? - @ViewBag.Title</title>
<link href="@Url.Content("~/Content/bootstrap/bootstrap.min.css")"
rel="stylesheet" />
<style>
body {
padding-top: 60px;
}
</style>
</head>
<body>
<div class="navbar navbar-inverse navbar-fixed-top">
<div class="container">
<div class="navbar-header">
<a class="navbar-brand" href="#">
Cade meu medico? - Área Administrativa
</a>
</div>
<div class="collapse navbar-collapse">
133
7.2. Criando a área administrativa Casa do Código
</li>
</ul>
</div>
</div>
</div>
<div class="container">
<div class="jumbotron">
<div class="container">
<h1>Quem é você?</h1>
<p> </p>
<div id="status"></div>
<p> </p>
<div>
<form id="form-login" name="form-login"
method="get"
action="javascript:function()">
<label for="txtLogin">Login</label>
<input type="text" id="txtLogin" name="txtLogin" />
<label for="txtSenha">Senha</label>
<input type="password" id="txtSenha"
name="txtSenha" />
<a id="botao-entrar" class="btn btn-primary btn-lg">
Entrar
</a>
</form>
</div>
</div>
</div>
<p style="text-align:center;">
@Html.ActionLink(
"Esqueceu sua senha?",
"EsqueceuSuaSenha",
"Home",
null,
134
Casa do Código Capítulo 7. Segurança: Criando sua área administrativa
<script src="@Url.Content("~/Scripts/jquery-2.0.2.min.js")"></script>
<script src="@Url.Content("~/Scripts/bootstrap.min.js")"></script>
</body>
</html>
$(document).ready(function () {
$("#status").hide();
$("#botao-entrar").click(function () {
135
7.2. Criando a área administrativa Casa do Código
$.ajax({
url: "/Usuarios/AutenticacaoDeUsuario",
data: { Login: $("#txtLogin").val(),
Senha: $("#txtSenha").val() },
dataType: "json",
type: "GET",
async: true,
beforeSend: function () {
$("#status").html("Estamos autenticando o usuário.
Só um instante...");
$("#status").show();
},
success: function (dados) {
if (dados.OK) {
$("#status").html(dados.Mensagem)
setTimeout(function () { window.location.href =
"/Home/Index" }, 5000);
$("#status").show();
}
else {
$("#status").html(dados.Mensagem);
$("#status").show();
}
},
error: function () {
$("#status").html(dados.Mensagem);
$("#status").show()
}
});
});
});
3) Informamos ao navegador o que deverá ser realizado antes da chamada ser re-
alizada ( beforeSend), caso a resposta seja de sucesso ( success) ou falha (
error). Simples!
136
Casa do Código Capítulo 7. Segurança: Criando sua área administrativa
Para testar o funcionamento de tudo que foi feito até aqui, precisamos adicionar
um usuário qualquer no banco de dados da aplicação para que possamos simular
a situação de sucesso (usuário encontrado), certo?! Faremos tal procedimento
adicionando o registro de usuário no banco de dados de forma direta com a cláusula
INSERT, apresentada pela listagem 6. Se você utilizou o script de criação do banco
de dados disponibilizado pode pular esse passo, o script adiciona esse registro
automaticamente na criação do banco de dados.
Listagem 7.6 -
:
137
7.2. Criando a área administrativa Casa do Código
O teste final a ser realizado para que possamos verificar se de fato tudo está fun-
cionando conforme o esperado é a verificação da existência do cookie que armazena
a informação do usuário recém-autenticado. A figura 7.5 comprova que tudo está
correto.
138
Casa do Código Capítulo 7. Segurança: Criando sua área administrativa
139
7.5. Implementando o filtro ‘AutorizacaoDeAcesso’ Casa do Código
140
Casa do Código Capítulo 7. Segurança: Criando sua área administrativa
catch (Exception)
{
return null;
}
}
}
}
141
7.5. Implementando o filtro ‘AutorizacaoDeAcesso’ Casa do Código
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using CadeMeuMedico.Repositorios;
namespace CadeMeuMedico.Filtros
{
[HandleError]
[AttributeUsage(AttributeTargets.Class |
AttributeTargets.Method,
Inherited = true,
AllowMultiple = true)]
public class AutorizacaoDeAcesso :
ActionFilterAttribute
{
public override void OnActionExecuting(
ActionExecutingContext FiltroDeContexto)
{
var Controller = FiltroDeContexto.
ActionDescriptor.
ControllerDescriptor.
ControllerName;
var Action = FiltroDeContexto.
ActionDescriptor.
ActionName;
142
Casa do Código Capítulo 7. Segurança: Criando sua área administrativa
LocalPath);
}
}
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using CadeMeuMedico.Filtros;
namespace CadeMeuMedico.Controllers
{
[AutorizacaoDeAcesso]
143
7.5. Implementando o filtro ‘AutorizacaoDeAcesso’ Casa do Código
}
}
144
Casa do Código Capítulo 7. Segurança: Criando sua área administrativa
145
Capítulo 8
• Windows (7, 7 com SP1, Server 2003 com SP2, Server 2008, Server 2008
R2, Server 2008 R2 com SP1, Vista com SP1, XP com SP3): você já conhece
o Windows, certo?
148
Casa do Código Capítulo 8. Publicando sua aplicação
• Servidor dedicado: neste caso, temos um servidor físico. Este servidor terá
todos os recursos disponíveis para executar o servidor de aplicação e “rodar”
a aplicação ASP.NET MVC. A única diferença em relação às VPS’s é o fato de
que um é virtualizado e o outro é físico;
Para cada um destes cenários, para que as aplicações possam ser enviadas ao ser-
vidor remoto, existem diferentes abordagens, tais como FTP, SFTP, Web Deploy etc.
Para cada um destes modelos, existem diversas ferramentas para realizar este envio.
149
8.3. Computação em nuvem. Por quê? Casa do Código
Para FTP, por exemplo, podemos citar o próprio Visual Studio Express, FileZilla,
CuteFTP, dentre outros. Se a escolha for pelo Visual Studio, existe ainda a opção
de gerar um pacote de publicação local (para publicar mais tarde) utilizando outra
ferramenta qualquer.
Para demonstrar a publicação da aplicação “Cadê meu médico?”, utilizaremos o
próprio Visual Studio. Você entenderá o porquê no momento adequado.
150
Casa do Código Capítulo 8. Publicando sua aplicação
O terceiro grupo (SaaS) nada mais é do que o resultado final, após a publicação.
São os softwares construídos especificamente para a plataforma de nuvem e que tem
comportamento ótimo neste ambiente. Exemplos: Office 365, Google Docs, Educa-
Net etc. “Cadê Meu Médico?” também será um software como serviço no fim deste
capítulo.
A figura 8.1 apresenta a relação entre as vertentes de computação em nuvem e o
esforço que deverá ser dispendido entre quem compra e quem fornece estes serviços.
151
8.5. Windows Azure Websites Casa do Código
• Git ou TFS deployment: com WAWS é possível utilizar Git ou TFS para efe-
tuar a publicação de suas aplicações de forma direta. Com algumas poucos
comandos e cliques, é possível habilitar o ambiente para deploy através destas
ferramentas;
• Log’s do site: WAWS armazena log’s dos sites lá armazenados. Você pode
monitorar a “saúde” de sua aplicação analisando-os. Este acesso pode ser rea-
lizado via client de FTP ou via ferramenta de linha de comando;
152
Casa do Código Capítulo 8. Publicando sua aplicação
para conectar sua aplicação. Para que MySQL pudesse funcionar com perfor-
mance e segurança no modelo de cloud, a Microsoft estabeleceu uma parceria
com uma empresa especializada, chamada ClearDB;
• Segurança: WAWS trabalha em modo full trust. Isto significa dizer que todas
as aplicações que “rodam” em ambiente compartilhado encontram-se comple-
tamente isoladas umas das outras. Este é um critério importante a ser avaliado
no momento de planejar seu website;
• Linguagens e frameworks: você já deve ter ouvido falar que WAWS suporta
nativamente ASP.NET, ASP.NET MVC, PHP, Node.js. Talvez o que você não
saiba é que suas aplicações ASP clássicas e 2.0 também são suportadas, logo,
seus códigos legados são bem-vindos dentro do Windows Azure Web Sites;
• Certificados: Windows Azure Web Sites oferecem suporte nativo para utili-
zação de SSL para domínios externos e internos;
153
8.6. Publicando a aplicação ‘Cadê Meu Médico?’ Casa do Código
• IIS8, Windows Server 2012 e .NET 4.5: para este primeiro preview, WAWS
não implementa IIS8, Windows Server 2012 e .NET 4.5. Muito embora as no-
vas versões ainda não sejam suportadas, estas deverão ser automaticamente
implementadas à medida que se tornarem estáveis. Hoje o ambiente é: IIS 7.5,
Windows Server 2008 R2 e .NET 4.5.
Uma pergunta que deve estar perturbando sua cabeça neste instante deve ser:
“Se o Windows Azure já possuía as web roles, o que justifica a existência de mais um
modelo pra host de aplicações web?“. Acertei?
A resposta é simples: Web roles são ambientes que permitem alto grau de per-
sonalização através de startup tasks. O objetivo das web roles é disponibilizar um
ambiente para host de aplicações web mais robusto e totalmente personalizável, ao
passo que o WAWS apresenta outro viés em termos de demanda: a simplicidade em
detrimento da personalização.
Se você precisa de um ambiente personalizado como, por exemplo, implementar
características específicas no IIS ou, ainda, adicionar novas configurações de ambi-
ente, WAWS não são para você. Neste caso, recomendamos considerar duas hipóte-
ses: Web Roles ou o recurso de máquinas virtuais.
154
Casa do Código Capítulo 8. Publicando sua aplicação
155
8.6. Publicando a aplicação ‘Cadê Meu Médico?’ Casa do Código
156
Casa do Código Capítulo 8. Publicando sua aplicação
Se você reparar bem no rodapé do portal administrativo, verá uma barra de status
que notifica o usuário final acerca do que está ocorrendo. Se tudo correr bem, você
visualizará o novo ambiente criado, conforme apresentado pela figura 8.5.
Pronto! Ambiente de host criado. Para finalizar esta etapa, clique no nome do
ambiente de hospedagem. Na tela que se apresenta, clique no link “Download the
publish profile”. Ao fazer isso, um arquivo XML com as configurações de publicação
será baixado. Guarde bem o local onde este arquivo será salvo. Ele será utilizado no
157
8.6. Publicando a aplicação ‘Cadê Meu Médico?’ Casa do Código
processo de publicação. A tela que exibe esta opção pode ser visualizada através da
figura 8.7.
Publicando a aplicação
Agora que já possuímos o ambiente de host criado, podemos publicar nossa apli-
cação. Como você irá constatar, a publicação de uma aplicação no Windows Azure
Web Sites com o Visual Studio é extremamente simples. Não poderia ser diferente,
já que os produtos são do mesmo fabricante.
Com o projeto “Cadê meu médico?” aberto (mas não em execução), clique com
o botão direito sobre o nome do projeto. No menu que se abrirá, selecione a opção
“Publish...”. Ao fazê-lo, uma nova janela de parametrização será exibida. Clique no
botão “Import”, disponível imediatamente a frente do combo box. Na janela que se
apresentará, selecione a opção “Import from a publish profile file” e clique no botão
“Browse”. Navegue até o arquivo de publicação que baixamos quando criamos o am-
biente de publicação e clique em “Open”. Ao selecionar o arquivo e clicar em “Ok”,
automaticamente o Visual Studio alternará a aba de “Profile” para “Connection”, con-
forme apresenta a figura 8.7.
158
Casa do Código Capítulo 8. Publicando sua aplicação
159
8.6. Publicando a aplicação ‘Cadê Meu Médico?’ Casa do Código
160
Casa do Código Capítulo 8. Publicando sua aplicação
Se tudo correu bem, você verá seu banco de dados criado na tela que exibe todos
os recursos, conforme ilustra a figura 8.10.
161
8.6. Publicando a aplicação ‘Cadê Meu Médico?’ Casa do Código
allowed IP addresses”. Na tela que se abrirá, você deverá especificar o intervalo de IP’s
permitidos. Para liberar todos, informamos os valores “0.0.0.0” até “255.255.255.255”,
isto é, todos. A figura 8.11 ilustra esta parametrização.
162
Casa do Código Capítulo 8. Publicando sua aplicação
Voltando à publicação...
Agora que já possuímos o banco de dados já publicado no Windows Azure, po-
demos seguir com o processo de publicação de nossa aplicação através do Visual
Studio. Estávamos na etapa onde configurávamos o banco de dados, certo? O que
precisaremos fazer agora é apontar para o banco que acabamos de migrar. A figura
8.14 apresenta a parametrização (que aponta para o banco online).
163
8.6. Publicando a aplicação ‘Cadê Meu Médico?’ Casa do Código
164
Casa do Código Capítulo 8. Publicando sua aplicação
Por fim, clique no botão “Publish”. Ao final, se tudo correr bem, o Visual Studio
abrirá a aplicação já no ambiente online do Windows Azure, conforme ilustra a figura
8.16.
165
8.7. Conclusão Casa do Código
8.7 Conclusão
Como você pôde perceber, existem diversas maneiras para que se possa publicar
aplicações ASP.NET MVC. No próprio Windows Azure, existem pelo menos 3 ma-
neiras distintas para executar este procedimento. Este capítulo apresentou apenas
uma delas — a mais simples. Entretanto, é importante mencionar que a ideia geral
não muda.
Esperamos que, ao completar a leitura deste livro, você possa ter ampliado seus
horizontes em relação aos conhecimentos técnicos no quesito “desenvolvimento
web” e, principalmente, considere utilizar ASP.NET MVC ao projetar aplicações fu-
turas.
166
Casa do Código Referências Bibliográficas
Referências Bibliográficas
[3] Steve Lydford. Building ASP.NET Web Pages with Microsoft WebMatrix. 2011.
[5] Fabrício Lopes Sanchez. Enriquecendo o visual de sua aplicação com master
pages (blog). 2010.
167