Escolar Documentos
Profissional Documentos
Cultura Documentos
Peter Rizzon
SUMÁRIO
Esta é uma obra coletiva organizada por iniciativa e direção do CENTRO SU-
PERIOR DE TECNOLOGIA TECBRASIL LTDA – Faculdades Ftec que, na for-
TRABALHANDO COM O C# 5 ENTENDENDO A ESTRUTURA DE UMA ma do art. 5º, VIII, h, da Lei nº 9.610/98, a publica sob sua marca e detém os
O PRIMEIRO PROGRAMA EM C# 6 APLICAÇÃO ASP.NET MVC NA PRÁTICA 24
direitos de exploração comercial e todos os demais previstos em contrato. É
VARIÁVEIS E TIPOS PRIMITIVOS 9 CONVENÇÕES DE NOMES 27 proibida a reprodução parcial ou integral sem autorização expressa e escrita.
SÍNTESE60
SESSÃO64 Desenvolvido pela equipe de Criações para o Ensino a Distância (CREAD)
IDENTIFICANDO OS NAVEGADORES 65 Coordenadora e Designer Instrucional
SESSÕES NO ASP.NET MVC 65 Sabrina Maciel
SESSIONMODE66 Diagramação, Ilustração e Alteração de Imagem
SÍNTESE67 Igor Zattera, Julia Oliveira, Thaís Munhoz
TRATAMENTO DE ERROS 71 Revisora
CUSTOM ERRORS 74
HTTP ERRORS 74
APRESENTAÇÃO
Prezado, acadêmico! Seja bem-vindo à disciplina de Projeto para sistemas web II!
A internet nunca mais foi a mesma desde que Tim Berners-Lee propôs, em março de
boratório Europeu para Física de Partículas – é uma das maiores instituições científicas do
mundo e seus laboratórios estão distribuídos por várias cidades localizadas em 19 países da
ambiente que ele classificou como “um modelo em miniatura do resto do mundo em alguns
anos”. O sistema proposto, inicialmente chamado de Mesh, acabou por convencer seus ge-
rentes e foi implantado no CERN no ano seguinte, já com o nome de World Wide Web.
Berners-Lee estava certo quando definiu o CERN como uma miniatura do mundo. Hoje,
muitos anos depois, a internet não é mais a mesma. Atualmente, a internet é a World Wide
A web evoluiu e ocupou todos os espaços, fazendo jus ao nome “World Wide”. As pá-
ginas deixaram de ser meras páginas e passaram a se comportar como aplicações. O brow-
ser evoluiu junto e passou a ser tratado como uma interface universal, capaz de oferecer ao
deixou de ser um mero serviço, passando a ser uma enorme plataforma, estimulando a cria-
5
SUMÁRIO
própria Microsoft. Apesar das explicações serem feitas com base na versão comunity, tudo
https://www.visualstudio.com/pt-br/downloads/
instalado em sua máquina, então ela estará pronta executar as aplicações escritas em C#.
O PRIMEIRO PROGRAMA EM C# No canto esquerdo da janela do assistente de criação de novo projeto, podemos esco-
lher a linguagem de programação que desejamos utilizar, escolha a opção Visual C#. Como
Para criarmos um programa C# utilizando o Visual Studio precisamos inicialmente de tipo de projeto escolha a opção Windows Form Application, com isso estamos criando um
Dentro do Visual Studio 2017, aperte o atalho Ctrl + Shift + N para abrir o assistente de No canto inferior da janela, podemos escolher o nome do projeto além da pasta em que
criação de novo projeto. ele será armazenado. Utilizaremos OiMundo como nome desse novo projeto.
Agora dê um duplo clique no botão que acabamos de adicionar para programarmos o que deve
acontecer quando o botão for clicado. O Visual Studio abrirá o código do formulário. Não se preocupe
Queremos inicialmente colocar um botão no formulário que, quando cli- com todo o código complicado que está escrito nesse arquivo, entenderemos o significado de cada uma
cado, abrirá uma caixa de mensagem do Windows. dessas linhas mais a frente no curso.
using System; {
Para colocarmos o botão no formulário, precisamos abrir uma nova ja- using System.Collections.Generic; public Form1()
using System.ComponentModel; {
nela do Visual Studio chamada Toolbox, que fica no canto esquerdo da jane- using System.Data; InitializeComponent();
using System.Drawing; }
la do formulário. O Toolbox também pode ser aberto utilizando-se o atalho private void button1_Click(object sender, EventArgs e)
using System.Linq;
Ctrl + Alt + X . Dentro da janela do “Toolbox”, no grupo “Common Controls”, using System.Text; {
using System.Windows.Forms; }
clique no componente “Button” e arraste-o para o formulário. namespace form }
{ }
public partial class Form1 : Form
for clicado. No clique do botão, queremos executar o comando que mostra uma caixa de
using System;
mensagens para o usuário.
using System.Collections.Generic;
using System.ComponentModel;
MessageBox.Show(mensagem) using System.Data;
using System.Drawing;
using System.Linq;
No C#, todo comando deve ser terminado pelo caractere “;”. Portanto, o código using System.Text;
para mostrar a caixa de mensagem fica da seguinte forma: using System.Windows.Forms;
namespace form
MessageBox.Show(mensagem); {
public partial class Form1 : Form
{
Queremos que, ao clicar no botão, a mensagem Hello World seja exibida em uma public Form1()
{
caixa de mensagens. Então, utilizaremos o seguinte código: InitializeComponent();
}
private void button1_Click(object sender, EventArgs e) private void button1_Click(object sender, EventArgs e)
{
{
MessageBox.Show(Hello World);
MessageBox.Show(“Hello World”);
}
}
}
Como a mensagem é somente um texto, o compilador do C# nos força a colocá-la }
entre aspas duplas. Portanto, o código do clique do botão ficará assim:
Não se preocupe com as linhas de código que não foram explicadas. Entenderemos o As variáveis guardam informações de um tipo específico. Podemos, por exemplo, guar-
que elas fazem durante o curso. dar um número inteiro representando o número da conta, um texto para representar o nome
do correntista ou um número real para representar o saldo atual da conta. Para utilizar uma
Aperte “F5” para executar o código do formulário. Ao clicar no “button1”, o resultado
variável, devemos primeiramente declará-la no texto do programa.
deve ser algo parecido com a imagem a seguir:
Na declaração de uma variável, devemos dizer seu tipo (inteiro, texto ou real, por exem-
plo) e, além disso, qual é o nome que usaremos para referenciá-la no texto do programa.
Para declarar uma variável do tipo inteiro que representa o número de uma conta, utiliza-
int numeroDaConta;
Além do tipo int (para representar inteiros), temos também os tipos double e float
VARIÁVEIS E TIPOS PRIMITIVOS
(para números reais), string (para textos), entre outros.
Na maioria dos programas que escrevemos, não estamos interessados em apenas mos-
Depois de declarada, uma variável pode ser utilizada para armazenar valores. Por
trar uma caixa de mensagens para o usuário, por exemplo. Queremos também armazenar e
exemplo, se estivéssemos interessados em guardar o valor 1 na variável numeroDaConta
processar informações.
que declaramos anteriormente, utilizaríamos o seguinte código:
o C# reservar regiões de memória que serão utilizadas para armazenar informações. Essas
Lê-se “numeroDaConta recebe 1”.
regiões de memória são conhecidas como variáveis.
Quando, no momento da declaração da variável, sabemos qual será seu valor, podemos utilizar Depois de realizar o saque, queremos mostrar para o usuário qual é o saldo atu-
a seguinte sintaxe para declarar e atribuir o valor para a variável. al da conta. Para mostrarmos essa informação, utilizaremos o MessageBox.Show:
OPERAÇÕES COM VARIÁVEIS Veja que, no código do saque, estamos repetindo o nome da variável saldo
dos dois lados da atribuição. Quando temos esse tipo de código, podemos utilizar
Agora que já sabemos como guardar informações no programa, estamos interessados em executar uma abreviação disponibilizada pelo C#, o operador -= :
operações nesses valores. Pode ser interessante para um correntista saber qual será o saldo de sua conta
double saldo = 100.0;
após um saque de 10 reais. Para realizar essa operação, devemos subtrair 10 reais do saldo da conta: double valorDoSaque = 10.0;
saldo -= valorDoSaque;
TIPOS PRIMITIVOS
Podemos ainda guardar o valor do saque em uma variável:
double saldo = 100.0; Vimos que no C# toda variável possui um tipo, utilizamos o int quando que-
double valorDoSaque = 10.0;
saldo = saldo - valorDoSaque; remos armazenar valores inteiros e double para números reais. Agora vamos des-
double 8 bytes Números até 10 elevado a 308. Exemplo: 10.0, 12.33 Nesse código, tentamos copiar o conteúdo de uma variável maior para den-
decimal 16 bytes Números com até 28 casas decimais. Exemplo: 10.991m, 33.333m tro de uma de tamanho menor. Essa cópia pode ser perigosa pois o valor que está na
char 2 bytes Caracteres delimitados por aspas simples. Exemplo: ‘a’, ‘ç’, ‘o’ variável do tipo int pode não caber na variável short e, por isso, o compilador do C#
guagem C#. Toda vez que atribuímos um valor para uma variável de um tipo primitivo, o C# copia
Para forçarmos o compilador do C# a fazer uma conversão perigosa, preci-
o valor atribuído para dentro da variável.
samos utilizar uma operação do C# chamada casting falando para qual tipo quere-
gem dentro de uma aplicação. Suponha que temos um código que declara uma variável do tipo inteiro int valor = 1;
e depois tenta copiar seu conteúdo para uma variável long: short valorPequeno = (short) valor;
Além dos tipos primitivos, o C# também possui um tipo específico para armazenar textos. No Quando queremos documentar o significado de algum código dentro de um pro-
tipo string, podemos guardar qualquer valor que seja delimitado por aspas duplas, por exemplo: grama C#, podemos utilizar comentários. Para fazermos um comentário de uma li-
string mensagem = “Olá ”; Muitas vezes precisamos escrever diversas linhas de comentários para, por
string nome = “victor”;
exemplo, documentar uma lógica complexa da aplicação. Nesses casos podemos uti-
MessageBox.Show(mensagem + nome);
lizar o comentário de múltiplas linhas que é inicializado por um /* e terminado pelo
/*
int idade = 25; Isso é um comentário
string mensagem = “sua idade é: ” + idade; de múltiplas linhas
MessageBox.Show(mensagem); */
SÍNTESE
tipadas.
Faça o código dos exercícios do capítulo dentro de botões no formulário do projeto ini- Repare o (int) . Estamos “forçando” a conversão do double para um inteiro.
a. 3.14 b. 0 c. 3
1. Crie 3 variáveis com as idades dos seus melhores amigos e/ou familiares. Em seguida, pe-
Crie um programa com três variáveis inteiras, a, b, c , com quaisquer valores. De-
c. O código não compila, pois 3.14 não “cabe” dentro de um inteiro.
pois crie 3 variáveis double, delta, a1, a2, com a fór mula anterior.
double pi = 3.14;
int piQuebrado = (int)pi; Dica: Para calcular raiz quadrada, use Math.Sqrt(variavel). Não se esqueça que
MessageBox.Show(“piQuebrado = ” + piQuebrado);
não podemos calcular a raiz quadrada de números negativos.
15
SUMÁRIO
O .NET Framework é um componente integral do Windows, que oferece suporte à • Tornar a experiência do desenvolvedor consistente, através dos diversos tipos de aplicati-
criação e execução de aplicativos e serviços web XML. É a tecnologia da Microsoft para vos, baseados no Windows e na web. O desenvolvedor pode usar qualquer linguagem su-
conectar informações, pessoas, sistemas e dispositivos através de software. Integrada portada pelo .NET para escrever os programas, e notará muitas semelhanças ao escrever
através da plataforma Microsoft, a tecnologia .NET fornece a habilidade de rapidamen- código para dois ambientes bastante distintos, como o desktop e o web, devido à camada de
te construir, instalar, gerenciar e conectar soluções com segurança em serviços web. abstração provida pelo .NET.
As soluções .NET permitem negócios para integrar seus sistemas rapidamente e, • Criar todas as comunicações nas indústrias padrão, para garantir que códigos baseados no
de uma maneira mais ágil, ajudar a realizar a promessa da informação, em qualquer lu- .NET Framework possam se integrar a qualquer outro código. O programador pode reuti-
gar, a qualquer momento e em qualquer dispositivo. lizar facilmente um código já existente, ainda que esteja em outra linguagem, sem que ele
precise abrir mão da sua linguagem de preferência (e.g. o programador pode escrever um
O .NET Framework foi criado para atender alguns objetivos:
programa em C# e utilizar componentes escritos em C#, VB para .NET sem problemas de
• Fornecer um ambiente da execução de código que minimiza conflitos de implanta- • Independência de linguagem de programação: permite a implementação do mecanismo
ção e versionamento de software, muito comum no modelo antigo de componenti- de herança, controle de exceções e depuração entre linguagens de programação diferentes.
zação COM/COM+ (conhecido como “DLL hell”).
• Reutilização de código legado: implica em reaproveitamento de código escrito usando ou-
• Fornecer um ambiente de execução que promova a execução segura do código, in- tras tecnologias como COM, COM+, ATL, DLLs e outras bibliotecas existentes.
cluindo o código criado por terceiros.
• Tempo de execução compartilhado: o “runtime” de .NET é compartilhado entre as diver-
• Fornecer um ambiente de execução que elimina os problemas de desempenho dos sas linguagens que a suportam, significando que não existe um runtime diferente para cada
ambientes interpretados ou com scripts. linguagem que implementa .NET.
• Sistemas autoexplicativos e controle de versões: cada peça de código .NET con- CTS (COMMON TYPE SYSTEM)
tém em si mesma a informação necessária e suficiente, de forma que o runtime
não precise procurar no registro do Windows mais informações sobre o programa O CTS, ou Sistema Comum de Tipos, que também faz parte do CLR, define os tipos suportados
que está sendo executado. Ele encontra essas informações no próprio sistema em por .NET e as suas características. Cada linguagem que suporta .NET tem, necessariamente, que
questão e sabe qual a versão a ser executada, sem acusar aqueles velhos conflitos suportar esses tipos. Apesar da especificação, não demanda que todos os tipos definidos no CTS
de incompatibilidade ao registrar DLLs no Windows. sejam suportados pela linguagem, podendo ser um subconjunto do CTS ou um superconjunto.
exemplo: um tipo Enum deve derivar da classe System. Enum e todas as linguagens devem im-
Para melhor entendermos tudo o que estudamos até aqui, vamos falar um pouco
plementar esse tipo dessa forma. Todo tipo deriva da classe Object, porque em .NET tudo é um
da arquitetura de .NET e os seus principais componentes.
objeto e, portanto, todos os tipos devem ter como raiz essa classe. É dessa forma que os diversos
tipos, nas diversas linguagens, são implementados, obedecendo às regras definidas no CTS.
CLR (COMMOM LANGUAGE RUNTIME)
ditas (apesar de executarem no ambiente Windows), razão pela qual o runtime Win32 não
CLS (COMMON LANGUAGE SPECIFICATION)
sabe como executá-las.
O Windows, ao identificar uma aplicação .NET, dispara o runtime .NET que, a partir O CLS, ou Especificação Comum da Linguagem, é um subconjunto do CTS, e define um
desse momento, assume o controle da aplicação no sentido mais amplo da palavra, por- conjunto de regras que qualquer linguagem que implemente a .NET deve seguir, a fim de que o
que dentre outras coisas, é ele quem vai cuidar do gerenciamento da memória por meio de código gerado, resultante da compilação de qualquer peça de software, escrita na referida lin-
um mecanismo chamado Garbage Collector (GC) ou Coletor de Lixo, ao qual falaremos mais guagem, seja perfeitamente entendido pelo runtime .NET.
Seguir essas regras é um imperativo porque, caso contrário, um dos grandes ga- Na BCL encontramos classes que contemplam desde um novo sistema de janelas a bibliote-
nhos do .NET, que é a independência da linguagem de programação e a sua interopera- cas de entrada/saída, gráficos, sockets, gerenciamento da memória, etc. Esta biblioteca de classes
bilidade, fica comprometido. é organizada hierarquicamente em uma estrutura conhecida como namespace. Ao desenvolver um
componente de software reusável, este precisa ser estruturado em um namespace, para que possa ser
Dizer que uma linguagem é compatível com o CLS significa que, mesmo quando usado a partir de um outro programa externo.
mente ela é igual, porque na hora da compilação será gerado um código intermedi- VISÃO GERAL DO ASP.NET
ário (e não código assembly dependente da arquitetura do processador), equivalente
para duas peças de código iguais, porém, escritas em linguagens diferentes. O ASP.NET é um conjunto de tecnologias para desenvolvimento web, que possibilita aos pro-
gramadores construir web site, aplicações web e web services XML. Pelo fato de o ASP.NET ser parte
É importante entender esse conceito, para não pensar que o código desen- do Framework .NET, você pode desenvolver aplicações web em qualquer uma das linguagens .NET.
guagens, porque mesmo estas sendo diferentes, todas são compatíveis com o CLS. Um dos principais componentes do ASP.NET é o web form. Uma aplicação ASP.NET típica, con-
siste de um ou mais web form. Um web form, que é uma página onde o usuário visualiza em seu brow-
BCL (BASE CLASSE LIBRARY) ser, sendo dinâmica e processada no servidor, podendo acessar recursos. Também pode ser utilizada
vimento de sistemas precisa ter uma biblioteca de classes básica, que alavanque a Em outras palavras, uma página HTML tradicional pode executar scripts no cliente para executar
simplicidade e a rapidez no desenvolvimento de sistemas. tarefas básicas. Já uma página ASP.NET web form pode também executar código ao lado do servidor, para
acessar banco de dados, gerar outros web forms ou fazer uso de dispositivos de segurança do servidor.
vedor uma biblioteca consistente de componentes de softwares reutilizáveis, que O ASP.NET é independente do dispositivo que for usado para acessá-lo, permitindo ao programador
não apenas facilitem, mas também acelerem o desenvolvimento de sistemas. desenvolver web forms que poderão ser vistos em quaisquer dispositivos que tenham um navegador web.
O ASP.NET também faz uso do Visual Studio para construir e executar as apli- COMPONENTES DE UMA APLICAÇÃO ASP.NET
cações ASP.NET. Isso resulta em um processo de desenvolvimento simplificado, per-
mitindo testar a aplicação sem precisar criar um ambiente de hospedagem externo. Os componentes de uma aplicação ASP.NET incluem:
• arquivos code-behind: o arquivo code-behind é associado ao web form que contém o código
O ASP.NET é também um ambiente de desenvolvimento web, que inclui fun-
Server-side para ele. Você também pode optar por criar uma página ASP.NET em único ar-
cionalidades para você desenvolver aplicações web com o mínimo de codificação,
quivo que contenha o HTML e o código fonte .NET;
em qualquer linguagem compatível com a CLR, incluindo Microsoft Visual Basic, C#,
• arquivos de configuração: são arquivos XML que definem a configuração da aplicação web
Microsoft JScript .NET, e J#.
no servidor. Cada aplicação web pode ter um ou mais arquivos. Já cada servidor web pode ter
• global.asax: o arquivo Global.asax contém um código para responder eventos a nível de apli-
cação, que são acionados pelo ASP.NET como erros não tratados na aplicação;
• XML web service: permitem a aplicação enviar e receber dados de um XML web service;
• conexões a banco de dados: permitem a aplicação web transferir dados de fontes de dados;
• itens adicionais: arquivos adicionais que você inclui na aplicação web como arquivos HTML
ASP.NET E AJAX
uma resposta de forma a não distrair o usuário ou mesmo interromper o que ele
O ASP.NET AJAX pode ser usado em conjunto com o código server-side que,
SÍNTESE
Além disso, tivemos o primeiro contato com os conceitos de CLR, CTS, CLS e
21
SUMÁRIO
O ASP.NET é uma tecnologia de desenvolvimento consolidada no mercado há alguns anos. Essa tec- Em aplicativos pequenos, o modelo, muitas vezes, é uma separa-
nologia se divide em dois grandes subtipos: o ASP.NET web forms e o ASP.NET MVC. Esse último é o gran- ção conceitual, em vez de física. Por exemplo, se o aplicativo apenas ler
de foco do nosso estudo. um conjunto de dados e enviá-lo para exibição, não terá uma camada de
Essa tecnologia, basicamente, faz uso de um padrão de design, o MVC, implementado na forma de um assume a função de um objeto de modelo.
framework pela Microsoft, e é esse framework, com todos os seus recursos, o grande responsável pela criação
O MVC é um padrão de arquitetura para o desenvolvimento de software, que visa separar as regras e As Views são componentes que exibem a Interface do Usuário (IU)
lógicas do negócio da apresentação em si, permitindo maior controle sobre a aplicação e possibilitando uma do aplicativo. Normalmente, esta IU é criada a partir dos dados do Mo-
manutenção isolada de ambos e maior segurança na aplicação. del. Um exemplo seria uma exibição de edição de uma tabela de produtos
O padrão MVC é responsável pela apresentação da aplicação, visando criar um código que não possui no estado atual de um objeto Product.
uma conexão forte entre as partes (loosely coupled). Essa é uma das bases do desenvolvimento de código atu-
al, e facilita muito a manutenção e adição de funcionalidades ao código, posteriormente. Dentro do padrão CONTROLLER
MVC há três elementos principais:
Os Models são as partes do aplicativo que implementam a lógica para o domínio de dados do aplicativo. tra informações; o Controller manipula e responde à entrada e à interação
Muitas vezes, os objetos de modelo recuperam e armazenam o estado do modelo em um banco de dados. Por do usuário. Por exemplo, o Controller manipula valores de uma consulta,
exemplo, um objeto Product pode recuperar informações de um banco de dados, operar nele e, em seguida, passando esses valores ao Model, que, por sua vez, pode usar estes valo-
gravar informações atualizadas de volta em uma tabela de produtos, em um banco de dados do SQL Server. res para consultar o banco de dados.
A conexão flexível entre os três componentes principais de um aplicativo MVC também pro-
• torna mais fácil gerenciar a complexidade ao dividir o aplicativo em Model, View e Controller;
gica deve ficar localizado no aplicativo: • usa um padrão Front Controller, que processa as solicitações do aplicativo web através de
um único Controller. Isto permite desenvolver um aplicativo que suporta uma poderosa in-
• a lógica da IU fica na View;
fraestrutura de roteamento;
Development);
• a lógica de negócios fica no Model.
• funciona bem com aplicativos web que são suportados por grandes equipes de desenvolve-
Essa separação ajuda a administrar a complexidade quando se cria uma aplicação,
dores, e com web designers que precisem de um grande grau de controle sobre o compor-
pois permite que se concentre em um aspecto da implementação por vez. Por exemplo,
tamento do aplicativo.
pode-se concentrar na exibição sem depender da lógica de negócios.
RECURSOS DA ESTRUTURA ASP.NET MVC • suporte abrangente para roteamento ASP.NET, poderoso componente de mapeamento de URL
que permite desenvolver aplicativos com URLs abrangentes e pesquisáveis. As URLs não pre-
A estrutura ASP.NET MVC fornece os seguintes recursos: cisam incluir extensões de nome de arquivo e são desenvolvidas para suportar padrões de de-
nominação de URLs, que funcionam bem para SEO (Search Engine Optimization – Otimização do
• separação de tarefas do aplicativo (lógica de entrada, lógica de negócio e Mecanismo de Pesquisa) e endereçamento REST (Representational State Transfer – Transferên-
lógica da IU), possibilitando testes usando o TDD. Todas as conexões na cia de Estado Representacional);
estrutura MVC são baseadas na interface e podem ser testadas usando ob-
jetos fictícios, que são objetos simulados que imitam o comportamento • suporte ao uso de marcação em arquivos de marcação de páginas ASP.NET (arquivos .aspx), de
dos objetos reais no aplicativo. Pode-se testar a unidade do aplicativo sem controle de usuário (arquivos .ascx) e de página mestra (arquivos .master) existentes como mo-
ter que executar os controladores em um processo ASP.NET, o que acelera delos de exibição. Pode-se usar recursos ASP.NET existentes com a estrutura ASP.NET MVC, como
e flexibiliza o teste da unidade; páginas mestras aninhadas, expressões em linha (<%= %>), controles de servidor declarativos,
MVC são desenvolvidos para serem facilmente substituídos ou personali- • suporte para recursos ASP.NET existentes. A estrutura ASP.NET MVC permite a utilização de re-
zados. É possível conectar o seu próprio mecanismo de exibição, política cursos como autenticação de formulários e autenticação do Windows, autorização de URLs, as-
de roteamento de URL, serialização de parâmetro ação-método e outros sociação e funções, caching de saída e dados, gerenciamento de estado de sessão e perfil, moni-
componentes. A estrutura ASP.NET MVC também suporta o uso dos mo- toramento de integridade, sistema de configuração e arquitetura de provedor.
IOC (Inversion of Control – Inversão de Controle). A DI permite injetar obje- ENTENDENDO A ESTRUTURA DE UMA APLICAÇÃO ASP.NET MVC NA PRÁTICA
tos em uma classe, em vez de depender da classe para criar o objeto. A IOC
especifica que se um objeto requer outro objeto, os primeiros devem obter Para entendermos a estrutura de uma aplicação ASP.NET MVC, vamos começar criando um pro-
o segundo objeto de uma fonte exterior, como um arquivo de configuração; jeto desse tipo. O primeiro passo é a criação de uma “ASP.NET Web Application”.
rios e referências para um projeto MVC. Repare, na figura, que existem diversos templates
que podem ser escolhidos, inclusive o MVC. Esse template traz uma série de elementos que
podem ser úteis em alguns casos. Para fins de exemplo, não iremos utilizá-lo, uma vez que
essa estrutura criada prejudica o entendimento dos recursos que o MVC Framework nos traz.
“Views”, como mostra a Figura 2. Além disso, as referências necessárias também estão adi-
cionadas. Repare que o projeto não traz nenhum tipo de CSS, por exemplo, que seria criado no
caso do uso do template MVC. É possível notarmos, na figura, o arquivo RouteConfig.cs. Esse
A Figura 3 ainda traz outros elementos que podemos notar. Um deles é o diretório
“App_Data”. Esse diretório precisa ser utilizado para guardar os dados privados da aplica-
ção, como bases de dados e arquivos XML. Essa nomeação de diretório garantirá que o IIS
(servidor) não utilizará o conteúdo do mesmo. Caso esses dados sensíveis estejam em outro
O projeto traz alguns arquivos básicos. O primeiro deles, Global.asax, é a classe de apli-
cação ASP.NET. Ele possui uma classe de code-behind (Global.asax.cs), onde devem ser regis-
Como podemos notar, projetos ASP.NET MVC possuem alguns elementos que são
vídeos da aplicação, embora não seja obrigatório. Outros, como o diretório “App_Start”,
é utilizado para arquivos de inicialização da aplicação. Isso pode ser alterado pelo desen-
volvedor, mas exige um trabalho muito maior, além de um conhecimento mais profundo
ler, uma janela irá abrir. É interessante que o Visual Studio já nos
As convenções de nomes são muito importantes em projetos ASP.NET MVC, porque o MVC Framework utiliza um traz uma sugestão, indicando a utilização do sufixo “Controller”.
conceito chamado de convention over configuration, que significa “convenção sobre configuração”. Esse conceito diz A utilização desse sufixo é uma convenção dentro do ASP.NET
que o desenvolvedor não precisa, explicitamente, criar associações entre controllers e views, por exemplo, se ele seguir MVC, e evita a alteração de outras configurações. Com esse pa-
uma convenção de nomes. Caso essa convenção seja utilizada, o sistema irá entender e fazer a ligação entre eles. drão, o MVC Framework irá conectar o controller à view de mesmo
Vamos realizar a criação de um controller em nossa aplicação exemplo. Ele estará no diretório “Controllers”, de chamado Default1Controller. Esse controller estará presente em
forma apropriada. Note, na Figura 4, que o Visual Studio novamente oferece uma série de templates para o controller. praticamente todos os projetos ASP.NET MVC criados.
A ideia é que algumas utilizações comuns dos mesmos sejam utilizadas com maior facilidade. Entretanto, estaremos
isso não é definido explicitamente, a aplicação irá procurar pela view SÍNTESE
com o nome do método de ação, Index, nesse caso. É a essa conven-
ção de nomes que precisamos estar atentos. Para isso, criamos uma Neste capítulo vimos:
Note que os projetos ASP.NET MVC seguem uma série de conven- de funções preexistentes.
Além disso, evitamos ter que alterar uma série de configurações dentro • Em termos práticos, uma camada nada mais é do que
do projeto. O objetivo é que tenhamos uma aplicação flexível, baseada uma parte lógica que agrupa classes e outras estru-
em uma série de elementos como os que mostramos até o momento. turas que possuam um comportamento semelhante.
30
SUMÁRIO
Uma aplicação web pode ser dividida em três camadas básicas: acesso a dados, Em resumo, o que esta camada deve definir é como estes dados serão apresentados para o
regras de negócio e visualização. O padrão MVC (Model-View-Controller) foca bas- usuário da aplicação.
O contrário também é válido, onde a camada de apresentação coleta os dados que são infor-
Existem diversos estudos, padrões e boas práticas de desenvolvimento no pa- mados pelos usuários e os envia à camada de controle, que os usa para alterar a camada de mode-
drão MVC. A maioria dos esforços para uma boa codificação de software se concentra lo, caracterizando o padrão MVC.
na camada de controle e modelo. Por muito tempo foi assim, a camada de visualiza-
Com o advento de tecnologias novas e robustas como o ASP.NET Razor, a cama- Na camada de apresentação de uma aplicação web podemos desenvolver dois tipos de pági-
da de visualização de dados de aplicações web dentro da plataforma .NET, mudou de nas: estáticas e dinâmicas.
Uma página estática é desenvolvida via HTML e não permite muita interação e funciona-
Existem boas práticas que devemos seguir também no desenvolvimento de nos- lidades, com exceção de links. Estas páginas são muito fáceis de serem desenvolvidas, porém,
sas páginas da camada de apresentação, que nos ajudarão em futuras manutenções não apresentam grande utilidade, tanto para os desenvolvedores quanto para os visitantes,
das aplicações desenvolvidas. já que somente pode-se apresentar textos corridos, imagens e alguns conteúdos multimídia,
CAMADA DE APRESENTAÇÃO
As páginas dinâmicas servem para adicionar funcionalidades e efeitos especiais. Para isso, é
A camada de apresentação é a responsável por apresentar as páginas de uma apli- necessário utilizar junto do HTML alguma outra linguagem de programação que possa prover es-
cação web. Os dados que devem ser apresentados na camada de apresentação são pro- tas funcionalidades extras, como PHP, JSP e ASP.NET. Essas páginas podem oferecer diversos re-
vidos pela camada de modelo, que envia informações para a camada de apresentação. cursos e efeitos, tornando-se muito mais complexas do que simples páginas estáticas com HTML.
RAZOR
Nota: devemos lembrar que o Razor não é uma nova linguagem de
programação, é simplesmente um novo modelo de desenvolvimento. O
Até a segunda versão do ASP.NET MVC, as páginas de uma aplicação poderiam ser que ocorre é que no back-end temos C# sendo executado.
desenvolvidas apenas em ASPX. A partir da terceira versão do framework, foi incluída uma
nova tecnologia, chamada Razor, para desenvolvermos estas páginas. SINTAXE E DECLARAÇÃO DE VARIÁVEIS RAZOR
O Razor é uma View Engine, uma forma de escrever visualizações em aplicações web.
Todas as expressões Razor devem, obrigatoriamente, iniciar com o caractere @. Toda
Esta tecnologia se caracteriza por ser simples, concisa e de fácil aprendizado, diferente-
a codificação Razor ficará dentro de um bloco {}. Ao utilizarmos o C#, a extensão do arqui-
mente do ASPX, onde precisamos de muito menos tags e scripts.
vo será “.cshtml”.
O Razor contribuiu tanto para a ferramenta Visual Studio, que View Engine passou a
Existem duas maneiras de declararmos variáveis em Razor, como veremos na Figura
ser padrão do framework a partir da versão três.
7. A primeira é num bloco de declaração único de variável, onde desejamos declarar apenas
A sintaxe ajuda a todos os desenvolvedores, tanto os sem experiência, que conse- uma variável, conforme a linha 7. Neste caso, declaramos e já iniciamos a variável site, para
guem aprender rapidamente e desenvolver as páginas, quanto os desenvolvedores expe- usá-la posteriormente na linha 11.
rientes, tornando-os mais produtivos.
Quando desejamos criar várias variáveis, podemos criar um bloco de comando múltiplo
Quando trabalhamos com a View Engine Razor, o que acontece na prática é um
Razor, através do @ e {}. Desta forma simplificamos a declaração e podemos declarar quan-
misto de códigos HTML com a sintaxe Razor. O servidor em primeira instância lê o có-
tas variáveis desejarmos dentro das chaves, conforme linhas 15 a 19. O acesso a elas é através
digo escrito e interpreta, primeiramente, o código Razor, para depois enviar a página
do bloco único, conforme linhas 24 a 27.
HTML para o navegador.
Para acessar as variáveis criadas é muito simples, basta adicionar o caractere @ segui-
Páginas web escritas utilizando a View Engine Razor têm a extensão (CSHTML),
do do nome da variável, quando estamos fora de um bloco Razor. Estando dentro do bloco (@
onde são misturadas tags HTML com scripts de servidor escritos em C# ou qualquer outra
{...}), o acesso é direto e não precisamos do @, conforme podemos ver na Figura 7.
linguagem de programação suportada pelo .NET.
<! -- ou -->
@{
int numero = 463;
if( numero == numeroDaFTEC )
{
<p>Chegou na FTEC!</p>
}
Figura 7 - Declaração de variáveis em Razor else
{
CONDICIONAIS (IF E ELSE) <p>Continue andando .</p>
}
Podemos utilizar os comandos de controle de fluxo if e else. }
Veja os exemplos.
LAÇOS DE REPETIÇÃO
ViewBag . HoraDoServidor = DateTime . Now . ToShortTimeString ();
ela. Na camada de apresentação, os itens armazenados na ViewBag podem ser acessados fa-
@for ( int i = 0; i < 5; i ++)
{ cilmente através da sintaxe da Razor. Veja um exemplo.
<p>i = @i </p>
} A hora do servidor é @ViewBag . HoraDoServidor
X possui o método Lower(). Se na ação for acionado um número suficiente de vezes, em Podemos também utilizar o comando using para evitar a escrita dos nomes completos
algum momento isso não será verdade, e um erro de execução ocorrerá. das classes.
@using FTEC.Models
Além disso, recursos do Visual Studio, como IntelliSense (recurso para completar
@model Faculdade
código) ou refatoração, não podem ser aplicados com o uso da ViewBag.
Para acessar o objeto transmitido da camada de controle à camada de apresentação, de-
Uma alternativa à utilização da ViewBag é o recurso strongly typed views. Com esse vemos utilizar a propriedade Model. Observe o código a seguir.
recurso podemos fixar, em tempo de compilação, o tipo do objeto que será transferido da
@using FTEC.Models
camada de controle à camada de apresentação. Uma vez que o tipo desse objeto foi fixado, o @model Faculdade
<p>
compilador é capaz de verificar a validade do código, evitando eventuais erros de execução.
Nome : @Model . Nome<br />
Email : @Model . Email
O Visual Studio pode auxiliar o desenvolvimento da aplicação com os recursos de </p>
IntelliSense e de refatoração. Para utilizar strongly type views, o primeiro passo é, na
Se tentarmos acessar um método ou propriedade inexistentes, um erro de compilação
camada de controle, passar como parâmetro para o método View() um objeto do tipo
ocorrerá, pois agora o compilador conhece o tipo do objeto transmitido. Dessa forma, o códi-
esperado pela camada de apresentação.
go produz um erro de compilação.
@using FTEC.Models
public ActionResult Acao ()
@model Faculdade
{
<p>
Faculdade faculdade = new Faculdade { Nome = “ FTEC “, Email = “ ftec@ftec.com.br” };
Nome : @Model . Nome<br />
return View ( faculdade );
Telefone : @Model . Telefone
}
</p>
Observe que apenas um objeto pode ser transmitido da camada de controle à cama-
@Html.ActionLink (“ Lista de cursos “, “ Index “, “ Faculdade “)
da de apresentação através do recurso strongly type views. Com a utilização de ViewBag,
diversos objetos podem ser transmitidos. Note também, que os dois recursos podem ser
Se o formato da URL para acessar a ação Index do controlador Faculdade for alterado,
utilizados ao mesmo tempo.
o código indicado não precisa ser alterado.
HTML HELPERS
ACTIONLINK HELPER
A função das páginas CSHTML é gerar hipertexto XHTML para enviar aos navegadores
O helper ActionLink é utilizado para gerar os links das páginas de uma aplicação web.
dos usuários. Os arquivos .cshtml misturam tags XHTML com scripts de servidor escritos em
Esse helper pode ser utilizado de diversas maneiras. A forma mais simples de utilizá-lo é
C# (ou outra linguagem de programação suportada pelo .NET). Essa mistura pode prejudi-
passar a ele dois parâmetros: o texto e a ação associados ao link desejado. Nesse caso, o
car a legibilidade do código, em alguns casos. Além disso, a manutenção da aplicação pode
link gerado pelo helper ActionLink estará associado ao controlador correspondente à pá-
se tornar mais complexa.
gina na qual o link foi inserido.
Considere a criação de um link utilizando diretamente as tags HTML. @Html.ActionLink (“ TEXTO PARA O USUÁRIO “, “ ACTION “ )
<a href =”/Cursos/Index/”>Lista de cursos </a> Podemos definir o controlador desejado explicitamente. Para isso, é necessário passar
código apresentado deverá ser modificado. Para facilitar a manutenção do código das pági-
@Html . ActionLink (“ TEXTO PARA O USUÁRIO “, “ ACTION “, “ CONTROLADOR “ )
nas CSHTML, o ASP.NET MVC oferece os chamados HTML helpers.
O helper ActionLink permite que parâmetros sejam adicionados nos links gerados. Para
A função de um HTML helper é encapsular um código XHTML. Por exemplo, para adi-
isso, é necessário passar um array como parâmetro.
cionar um link, podemos usar o método ActionLink do objeto HTML, ao invés de usar a tag
@Html.ActionLink (“ TEXTO PARA O USUÁRIO “, “ ACTION “, new { Inicio = 0, Final = 10 })
<a> do HTML diretamente. No código criamos um link à ação responsável por listar os cursos.
CHECKBOX O valor enviado através do checkbox inserido no formulário será armazenado na pro-
priedade “Aceito” do contrato enviado como parâmetro para a ação Cadastra(). Dessa for-
Podemos adicionar um checkbox em um formulário através do helper CheckBox.
ma, a classe Contrato deve possuir uma propriedade booleana chamada Aceito.
TEXTBOX
Considere o formulário a seguir:
@using ( Html . BeginForm (“ Cadastra “, “ Contrato “)) Uma caixa de texto pode ser adicionada através do helper TextBox.
{
@Html . CheckBox (“ Aceito “, false ) @Html.TextBox (“ Nome “, “ Digite o seu nome “)
<input type =” submit “ value =” Cadastra Contrato “/>
}
O código apresentado produz o seguinte trecho de código HTML:
Agora, considere a ação associada ao formulário criado no código anterior.
<input id=” Nome “ name =” Nome “ type =” text “ value =” Digite o seu nome “ />
public class ContratoController : Controller
{
// POST : / Contrato / Cadastra TEXTAREA
[ HttpPost ]
public ActionResult Cadastra ( Contrato contrato )
{ Uma caixa para textos maiores pode ser adicionada através do helper TextArea.
...
return View (); @Html.TextArea (“ Mensagem “, “ Digite uma mensagem “)
}
}
O código exibido produz o seguinte trecho de código HTML: O código apresentado produz o seguinte trecho de código HTML:
RADIOBUTTON
LAYOUTS
Essa não é uma boa abordagem, pois quando alguma alteração precisa
O código indicado produz o seguinte trecho de código HTML: ser realizada, todos os arquivos devem ser modificados. Também é comum
que as páginas de uma aplicação web possuam um certo padrão visual, sur-
<input checked =” checked “ id=” CidadeNatal “ name =” CidadeNatal “ type =” radio “ value =” São Paulo “ /> gindo o conceito de Layouts.
<input id=” CidadeNatal “ name =” CidadeNatal “ type =” radio “ value =” Natal “ />
<input id=” CidadeNatal “ name =” CidadeNatal “ type =” radio “ value =” Piracicaba “ />
CONTEÚDO COMUM
Uma caixa para senha pode ser adicionada através do helper Password. realizada modificando-se apenas um arquivo.
Por exemplo, suponha que toda página de uma aplicação web deva ter o mesmo título e a mes- Quando a página de edição de editoras é requisitada, o arquivo Edit.cshtml é
ma formatação. Podemos criar um Layout com o título desejado e com a referência ao arquivo CSS processado antes do arquivo FTECLayout.cshtml, o que permite definir o valor de
<! DOCTYPE html > Para definir o layout de Edit.cshtml, foi necessário armazenar o caminho
<html > completo do arquivo que define o layout na propriedade Layout. Este procedi-
<head >
<title >@ViewBag . Title </ title > mento não é muito prático, pois em cada página que deseja utilizá-lo, é neces-
@Styles.Render (“~/Content/css”) sário definir esta propriedade.
@Scripts.Render (“~/bundles/modernizr “)
</ head >
A partir da terceira versão do ASP.NET MVC, temos uma nova funcionalidade
<body >
que permite definir um layout padrão para todas as páginas, não havendo neces-
<div id=” header “>
@Html.ActionLink (“ Faculdades “, “ Index “, “ Faculdade “) sidade de definir a propriedade Layout em cada uma. Para isso, basta acrescentar-
@Html.ActionLink (“ Cursos “, “ Index “,” Curso “)
mos o arquivo _ViewStart.cshtml à pasta Views.
</ div >
@RenderBody ()
O _ViewStart.cshtml permite definirmos um código que será executa-
@Scripts.Render (“~/bundles/jquery “)
@Scripts.Render (“~/bundles/bootstrap “) do antes de cada página ser renderizada. Nesse arquivo podemos definir, por
@RenderSection (“scripts”, required:false ) exemplo, a propriedade Layout:
</ body >
</ html >
@{
Layout = “~/Views/Shared/FTECLayout.cshtml “;
Na definição apresentada no código anterior, utilizamos o método Render() das propriedades }
Styles e Scripts para adicionar conteúdo CSS e JavaScript. Na tag <title>, acrescentamos @ViewBag.
Title, para que cada página possa definir o seu próprio título. Por fim, o método RenderBody() indica Como este código é processado antes dos arquivos específicos de cada página,
onde o conteúdo definido em cada página será adicionado. não há mais necessidade de definir a propriedade Layout em cada arquivo específico.
SÍNTESE
1. Crie um projeto do tipo ASP.NET web application chamado CamadaDeApresentacao no Visual 4. Altere o arquivo Index.cshtml do exercício anterior para imprimir uma mensagem a
@{
2. Adicione um controller chamado Sorte no projeto CamadaDeApresentacao, utilizando o tem- ViewBag . Title = “ Index “;
plate EmptyMVC Controller. Nesse controlador, defina uma ação chamada Index. string mensagem = “ Olá! O seu número da sorte é “ + @
ViewBag . NumeroDaSorte ;
}
namespace CamadaDeApresentacao.Controllers
{
@for ( int i = 0; i < 10; i ++)
public class SorteController:Controller
{
{
<h2 >@mensagem </h2 >
public ActionResult.Index ()
}
{
Random random = new Random ();
ViewBag.NumeroDaSorte = random.Next ();
5. No projeto CamadaDeApresentacao, adicione um controlador chamado Relogio
return View ();
} utilizando o template EmptyMVCController. Nesse controlador, defina uma ação
} chamada Agora. Essa ação deve armazenar a data e o horário atual na ViewBag.
}
tyMVC Controller. Nesse controlador, defina uma ação para transmitir <h2>Detalhes</h2>
<p>AlunoID : @Model.AlunoID</p>
para a camada de apresentação um objeto da entidade Aluno. Utilize
<p>Nome : @Model.Nome</p>
strongly type views. <p>Email : @Model.Email</p>
11. Adicione uma tela associada à ação Lista do controlador Aluno com o seguinte conteúdo.
<table >
<tr >
<th >AlunoID </th >
<th >Nome </th >
<th >Email </th >
</tr >
@foreach (var a in @Model )
{
<tr >
<td >@a. AlunoID </td >
<td >@a. Nome </td >
<td >@a. Email </td >
</tr >
}
</ table >
44
SUMÁRIO
No ASP.NET MVC as URLS são mapeadas para métodos (ações) em classes que defi- ACTIONS
nem os chamados controladores. As requisições enviadas pelos navegadores são proces-
sadas pelos controladores. Os controladores e as ações são elementos fundamentais de uma aplicação ASP.NET MVC.
Um controlador pode conter diversas ações, que são utilizadas para processar as requisições
O processamento realizado por um controlador, para tratar uma requisição, consis- realizadas pelos navegadores. Para criar uma ação é necessário definir um método public dentro
usuários através de formulários HTML. Esse método deve devolver um ActionResult, que será
• interagir com a camada de modelo;
utilizado pelo ASP.NET MVC para definir o que deve ser executado depois que a ação terminar.
• acionar a camada de apresentação para construir a página HTML, que deve ser enviada
para o usuário como resposta a sua requisição. Quando um usuário faz uma requisição HTTP através de um navegador, o ASP.NET
MVC verifica, na tabela de rotas, o controlador e a ação associados à URL da requisição reali-
Para que uma classe seja considerada um controlador, ela deve seguir algumas regras: zada. Essa tabela é definida no arquivo RouteConfig.cs e inicializada no arquivo Global.asax.
System.Web.Mvc.Controller.
ACTIONRESULT
Raramente, você definirá uma classe para criar um controlador implementando a in-
Quando uma ação termina, o método correspondente deve devolver um ActionResult.
terface IController. As classes que definem controladores derivam de Controller, incluindo
O valor devolvido indica para o ASP.NET MVC o que deve ser executado depois da ação. Veja
diversas propriedades e métodos herdados. Essas propriedades facilitam o processamento
uma lista com alguns tipos específicos de ActionResult que podem ser utilizados.
das requisições e a utilização dos recursos do ASP.NET MVC.
É possível especificar o nome do arquivo que define a página de resposta e o objeto que
public class TesteController
{ deve ser transmitido à camada de apresentação, ao mesmo tempo.
public ActionResult Acao ()
{ return View (“ NomeDaView “, editora );
return View ();
}
• RedirectResult: redireciona o navegador para uma URL específica.
}
chamado sem parâmetros, executará o seguinte processo para determinar qual arquivo deve • RedirectToAction: redireciona para outra ação da camada de controle.
ser utilizado na construção da página de resposta.
return RedirectToAction (“ OutraAction “, “ OutroController “);
Podemos especificar o nome do arquivo que define a página de resposta. Veja o exemplo.
return Json ( editora )
páginas fortemente tipadas. return JavaScript (“\$( ’\# divResultText ’). html (’ JavaScript Passed ’);”);
O ASP.NET MVC também é capaz de montar objetos, com os valores dos parâmetros
[ HttpPost ]
HTTP enviados pelo usuário, e passá-los como argumento para as ações dos controladores. public ActionResult Salva ( Editora editora )
{
db.Editoras.Add( editora );
db.SaveChanges ();
[ HttpPost ]
TempData [“ Mensagem “] = “ Editora cadastrada com sucesso !”;
public ActionResult Salva ( Editora editora )
return RedirectToAction (“ Index “);
{
}
db.Editoras.Add ( editora );
return View ();
} Na camada de apresentação podemos recuperar os dados armazenados na proprie-
dade TempData.
As propriedades dos objetos recebidos como argumentos, nas ações dos controla-
Veja o código a seguir:
dores, precisam ter os mesmos nomes dos parâmetros HTTP, ignorando-se letras mai-
O código mostra a rota padrão inserida nos projetos ASP.NET MVC. ADICIONANDO UMA ROTA
routes.MapRoute ( Para acrescentar uma rota, podemos utilizar o método MapRoute(). Suponha que a
name : “ Default “, listagem de editoras deva ser acessada através da URL http://localhost:<PORTA_APP>/
url : “{ controller }/{ action }/{ id}”,
Catalogo. Nesse caso, podemos adicionar uma rota no arquivo RoutesConfig.cs, como
defaults : new { controller = “ Home “, action = “ Index “, id = UrlParameter . Optional
} mostrado no exemplo.
);
routes.MapRoute (
name : “ Nova Rota “,
O primeiro argumento do método MapRoute é o nome da rota, o segundo é a expressão url : “ Catalogo “,
que define o formato da rota e o terceiro é o conjunto de valores padrão dos parâmetros da rota. defaults : new { controller = “ Editora “, action = “ Index “ }
);
A expressão que determina o formato da rota Default utiliza três parâmetros: con-
IMPORTANTE
troller, action e id. Dessa forma, se o usuário realizar uma requisição HTTP utilizando URL
As rotas associam URLs e ações. Veja alguns exemplos de como as URLs serão proces-
ADICIONANDO PARÂMETROS NAS ROTAS
sadas de acordo com as regras de rotas:
de editoras listadas.
double?, respectivamente.
Por padrão, os parâmetros adicionados a uma rota são obrigatórios. Dessa forma, no exemplo apre-
sentado, a listagem de editoras só poderá ser acessada se o valor do parâmetro máximo for definido na URL SÍNTESE
da requisição. Por exemplo, http://localhost:<PORTA_APP>/Catalogo/20. Se uma requisição for realizada
para a URL http://localhost:<PORTA_APP>/Catalogo, um erro ocorrerá. Para mudar esse comportamento, Neste capítulo vimos:
Os parâmetros das rotas podem ser recuperados nas ações. Observe o exemplo. E todo Controller tem pelo menos uma Action, que é a ação (método)
1. Crie um projeto do tipo ASP.NET web application chamado CamadaDeControle no Visual 4. Adicione um controlador chamado Produto utilizando o template EmptyMVC Controller.
5. Adicione uma tela associada à ação Lista do controlador Produto com o seguinte conteúdo. 6. Adicione uma tela associada à ação Cadastra do controlador Produto com o seguinte
conteúdo.
@using CamadaDeControle.Models
@model CamadaDeControle.Models.Produto
@model IEnumerable <Produto >
@{ @{
ViewBag . Title = “ Lista “; ViewBag . Title = “ Cadastra “;
} }
7. Altere a ação Cadastra do controlador Produto. 9. Modifique o arquivo Lista.cshtml da pasta Views/Produto.
11. Altere a rota padrão do projeto CamadaDeControle. Para isso, modifique o arquivo Rou-
routes.MapRoute (
name : “ Default “,
url : “{ controller }/{ action }/{ id}”,
defaults : new {
controller = “ Produto “,
action = “ Lista “,
id = UrlParameter . Optional
}
);
12. Adicione duas ações no controlador Produto para implementar a edição de produtos.
13. Modifique a página de listagem de produtos. Para isso, altere o arquivo Lista.cshtml da
pasta Views/Produto.
55
SUMÁRIO
Um dos principais requisitos necessários em uma aplicação web é o de segurança. Em algumas aplica-
ções, como as bancárias, pode ser o principal requisito. Por isso, a tecnologia utilizada para o desenvolvi-
mento de aplicações web deve oferecer o maior número de mecanismos de segurança, a fim de impedir que
usuários mal-intencionados possam burlar os sites, informar dados inválidos ou se passar por outra pessoa.
Outro ponto de importância em uma aplicação web é a questão da velocidade do site, pois não exis-
te nada mais desagradável para o usuário do que um site lento e que demora muito para responder, ou
simplesmente congela, sendo que, às vezes, chega até a travar o browser, forçando o usuário a reiniciar
o navegador. Certamente, quando isso ocorre, o usuário pensará duas vezes antes de entrar novamente,
além de provocar, às vezes, um efeito em cascata, quando ele comenta com outras pessoas da dificul-
Não basta termos apenas uma aplicação web segura, também precisamos de agilidade. Podemos
aplicar formas mais rápidas e mais lentas de fazermos as validações, cabendo a nós decidir qual é a mais
Uma validação no lado cliente é sempre mais rápida do que uma validação que precisa ir ao servidor.
Porém, isso não significa que não devemos ter validações no lado servidor, pois existem situações onde
não temos dados suficientes para realizarmos a validação no lado cliente. Ainda existe a possibilidade
de existir usuários que entendem um pouco de ambiente web e desativem o JavaScript do navegador,
de maneira que as validações no lado cliente parem de funcionar. PNão basta que os desenvolvedores
implementem validações no lado cliente; eles devem validar as informações também no lado servidor,
ainda que seja a mesma informação sendo avaliada mais de uma vez. Desta forma, se a validação do lado
Por mais simples que sejam alguns sistemas web, eles sempre precisam de algum tipo Por isso, devemos planejar bem os tipos de informações que serão expostas antes de ini-
de validação, pois os usuários, muitas vezes, não têm atenção no preenchimento dos dados, ciar a validação. Por exemplo, é importante que campos numéricos sejam delimitados, evitan-
devendo nós, desenvolvedores, ficarmos atentos a isso. Usuários mais experientes podem do tanto a quebra de regras de negócio quanto a ultrapassagem dos limites aceitos pela base de
tentar usar mecanismos de SQL Injection, por exemplo, para ocasionar danos ao sistema. dados. Em alguns campos de texto, os caracteres especiais também devem ser negados, evitan-
usuários, preparando o sistema para se comportar de forma a evitar danos ao seu funciona-
Essas validações são definidas no lado cliente e no lado do servidor: nos clientes,
mento, fazendo o tratamento de forma adequada, impedindo a entrada dos dados não de-
esssas validações fazem uso do JavaScript, e no servidor, são feitas utilizando a lingua-
sejados e orientando o usuário a tomar a ação correta ao submeter os dados no formulário.
gem de programação C#.
Existem algumas formas de prevenir os erros, usando máscaras para delimitar o for-
CONTROLLER
mato do campo ou labels indicando o que o campo espera. Ainda que esta segunda opção não
restrinja a inserção de valores no formato esperado, ela é importante para manter o usuário
O primeiro passo para implementar a validação dos parâmetros enviados através de
informado sobre o tipo de informação que está sendo requisitado em determinado campo,
formulários HTML é definir a lógica de validação na camada de controle.
evitando a ocorrência de erros não intencionais.
Alguns campos geralmente não são validados, por não serem considerados de pre- if ( editora . Nome == null || editora . Nome . Trim (). Length == 0)
{
enchimento obrigatório ou não serem utilizados com frequência. Esses campos podem se // Erro de Validação
mostrar uma brecha na segurança do site, portanto, a eles precisam ser dadas as devidas }
atenções no momento de planejar a sua validação. Um bom exemplo são campos de obser-
vação, que, a princípio, não são obrigatórios e, frequentemente, não é feito nenhum tipo de O segundo passo é definir mensagens informativas para enviar aos usuários. O ASP.
verificação neles, abrindo espaço para que sejam utilizados, por exemplo, para ataques XSS, NET MVC possui um objeto especializado no armazenamento de mensagens de erros de va-
injetando scripts na sua aplicação e prejudicando-a. lidação. Esse objeto pode ser acessado através da propriedade ModelState.
if ( editora . Nome == null || editora . Nome . Trim (). Length == 0) O ASP.NET MVC também pode adicionar mensagens no ModelState antes do controlador
{ ser chamado. Essas mensagens estão relacionadas a erros de conversão. Por exemplo, um campo
ModelState.AddModelError (“ Nome “, “O campo Nome é obrigatório “);
} que espera um número é preenchido com letras.
lidationSummary(), devemos passar como parâmetro o valor true. Nesse caso, apenas os erros As lógicas de validação também podem ser definidas através de anotações adicionadas
que não estão associados a um grupo específico serão apresentados pelo ValidationSummary(). nas classes de modelo. Dessa forma, essas lógicas não estariam mais nos controladores, o
que conceitualmente é o ideal, pois nos controladores só deveriam existir lógicas para con-
Uma das validações mais comuns é o campo obrigatório, podendo ser realizada atra-
@using ( Html . BeginForm ()) {
@Html . ValidationSummary ( true ) vés da anotação Required para propriedades do tipo string.
<br/>
ALTERANDO A MENSAGEM
@Html.LabelFor ( model => model . Email )
@Html.EditorFor ( model => model . Email )
As anotações de validação possuem mensagens padrão que podem ser alteradas atra-
@Html.ValidationMessageFor ( model => model . Email )
vés do atributo ErrorMessage.
<br/>
<input type =” submit “ value =” Enviar “ /> [ Required ( ErrorMessage =”O campo Nome é obrigatório “)]
} public string Nome { get ; set; }
As validações também podem ser realizadas nos navegadores para melhorar a interação
com os usuários. Antes da terceira versão do ASP.NET MVC, era necessário habilitar a validação
Para que a validação no lado cliente funcione corretamente, devemos acrescentar as bibliotecas
JavaScript necessárias. No ASP.NET MVC, basta acrescentar a seção de scripts nas páginas.
@section Scripts {
@Scripts . Render (“~/ bundles / jqueryval “)
}
SÍNTESE
• O ASP.NET tem um modelo de validação de dados composto de controles, que são declarados
• As validações de entrada são frequentemente usadas em conjunto com outros tipos de validação.
1. Crie um projeto do tipo ASP.NET web application chamado Validacao no Visual Studio. Utilize o template MVC. 5. Adicione um controlador chamado Jogador utilizando o template
EmptyMVC Controller.
3. Adicione um DbContext para registrar a entidade Jogador e utilizar os recursos do Entity Framework. [ HttpPost ]
public ActionResult Cadastra ( Jogador j)
{
4. Crie uma classe chamada FTECContext na pasta Models. FTECContext ctx = new FTECContext ();
ctx . Jogadores .Add (j);
ctx . SaveChanges ();
namespace Validacao . Models
{ return RedirectToAction (“ Lista “);
public class FTECContext : DbContext }
{ }
public DbSet < Jogador > Jogadores { get ; set ; } }
}
}
6. Adicione uma tela associada à ação Lista do controlador Jogador 7. Adicione uma tela associada à ação Cadastra do controlador Jo-
com o seguinte conteúdo. gador com o seguinte conteúdo.
@using Validacao.Models
@model IEnumerable <Jogador > @model Validacao . Models . Jogador
@{ @{
ViewBag.Title = “ Lista “;
ViewBag . Title = “ Cadastra “;
}
}
[ HttpPost ]
public ActionResult Cadastra ( Jogador j)
{
if ( String . IsNullOrEmpty (j. Nome ))
{
ModelState . AddModelError (“ Nome “, “O nome do jogador é obrigatório “);
}
if (j. Numero == null || j. Numero <= 0 || j. Numero >= 100)
{
ModelState . AddModelError (“ Numero “, “O número do jogador deve ser maior que 0 e menor que 100 “);
}
if (j. Altura == null || j. Altura < 0)
{
ModelState . AddModelError (“ Altura “, “A altura do jogador não pode ser negativa “);
}
if ( ModelState . IsValid )
{
FTECContext ctx = new FTECContext ();
ctx.Jogadores .Add (j);
ctx.SaveChanges ();
eturn RedirectToAction (“ Lista “);
}
else
{
return View (“ Cadastra “, j);
}
}
9. Altere o formulário de cadastro de jogador. Para isso, modifique o arquivo Cadastra.cshtml da pasta Views/Jogador.
11. Altere a ação Cadastra do controlador Jogador para a gravação dos dados do Jogador.
64
SUMÁRIO
Considere a aplicação de uma loja virtual. Nessa aplicação, os clientes A partir da segunda requisição, os navegadores devem enviar para a aplicação o identificador re-
selecionam os produtos desejados e os adicionam no seu carrinho de compra. cebido na primeira requisição. Desta maneira, a aplicação saberá qual é o navegador que está realizando
Cada cliente deve ter o seu próprio carrinho, para que os seus produtos não se uma requisição. Os navegadores podem enviar os seus respectivos identificadores de diferentes formas.
armazenar o carrinho de um cliente até que a compra seja finalizada ou até ela As mais utilizadas são:
Reescrita de URL: nesta abordagem, os identificadores são embutidos nos links e botões das pá-
Para resolver esse problema, podemos utilizar o conceito de Sessão. ginas da aplicação. Quando os links ou botões são clicados pelo usuário, o identificador é enviado para a
Para cada navegador conectado, o servidor manterá uma sessão aberta. Des- aplicação. Uma desvantagem é que todas as páginas devem ser geradas dinamicamente para adicionar o
sa forma, podemos separar os dados de cada usuário conectado. identificador em todos os links e botões.
IDENTIFICANDO OS NAVEGADORES Cookies: são arquivos contendo informações, gerados nos servidores e enviados para os navegadores. Os
navegadores armazenam os cookies localmente na máquina do usuário. Além disso, os navegadores enviam os
Para aplicar a ideia de Sessão, é necessário ter a capacidade de identi- cookies de volta para o servidor em todas as requisições. Os servidores podem armazenar os identificadores gera-
ficar o navegador que está requisitando a aplicação a cada requisição. Uma dos em cookies. Dessa forma, a cada requisição, o servidor receberá um cookie contendo o identificador.
car os navegadores. Porém, nessa abordagem, dois navegadores executando SESSÕES NO ASP.NET MVC
na mesma máquina não poderiam ser identificados individualmente.
No ASP.NET MVC, o objeto que representa uma sessão é um dicionário. Para armazenar informações,
Outra abordagem é deixar a cargo do servidor a criação de um identi- você deve adicionar uma chave e um valor na propriedade Session. Considere um objeto da classe Usuario
ficador único para cada navegador conectado. Quando um navegador faz a que agrupa as informações sobre um determinado usuário. O código a seguir é um exemplo de como po-
primeira requisição para a aplicação, o servidor deve gerar um identificador demos guardar esse objeto na sessão após a realização da autenticação do usuário.
SESSIONMODE
Você pode adicionar qualquer tipo de valor na sessão. De forma análoga, para
• InProc;
Cliente cliente = ( Cliente ) Session [“ Cliente “];
string saudacao = “Bem vindo “ + cliente . Nome ; • StateServer;
• SQLServer;
Quando um usuário deslogar, podemos eliminar a informação armazenada em
sua sessão. Para isso, podemos simplesmente remover todas as chaves do dicionário • Custom.
como no exemplo a seguir.
No modo InProc, todas as informações da sessão são armazenadas na memória do servidor. Esse
Contudo, o método RemoveAll() não elimina a sessão. Ele apenas remove os
é o modo mais simples e mais utilizado, e vem configurado como o padrão. Uma desvantagem desse
dados nela contidos. Para eliminá-la, você deve utilizar o método Abandon(). Ob-
modo é a possível sobrecarga de memória, se forem armazenadas muitas informações na sessão. Por
serve o exemplo a seguir:
isso, não é indicado para sistemas muito grandes, com muitos usuários navegando simultaneamente.
Outro problema é que o servidor da aplicação não pode ser desligado, pois a informa- Outra possibilidade é desabilitar o uso de cookie com o atributo cookieless. Neste caso
dependente do servidor da aplicação. Isto possibilita que o servidor de aplicação possa ser SÍNTESE
reiniciado sem que as sessões sejam perdidas. Uma desvantagem é o tempo gasto para rea-
modo possibilita um maior controle de segurança dos dados da sessão. Uma desvantagem
• O ambiente de Sessão do ASP.NET é extensível, permitindo que qualquer desenvolvedor
importante é que o processo é naturalmente lento.
crie seu próprio mecanismo para armazenamento dos dados da Sessão, possibilitando
Para selecionarmos alguns dos modos disponíveis, basta adicionarmos a tag <sessionS-
tate> dentro da tag <system.web>, no arquivo Web.Config da raiz de um projeto ASP.NET MVC.
tate>. Por exemplo, podemos determinar o tempo de timeout das sessões. Veja o exemplo.
1. Crie um projeto do tipo ASP.NET Web Application chamado Sessao no Visual Studio. Utilize o template MVC.
3. Adicione uma classe chamada FTECContext na pasta Models, para registrar a entidade Produto e utilizar os
recursos do Entity Framework. Lembre-se de fazer com que sua classe herde da classe DbContext.
namespace Sessao . Models
{
public class FTECContext : DbContext
{
public DbSet < Produto > Produtos { get ; set ; }
}
}
public Carrinho ()
{
this.Produtos = new List < Produto >() ;
}
}
}
<p>
@Html.ActionLink (“ Create New “, “ Create “)
</p>
<table >
<tr >
<th >@Html.DisplayNameFor ( model => model.Nome )</th >
<th >@Html.DisplayNameFor ( model => model.Preco )</th >
<th ></th >
</tr >
6. Adicione um controlador chamado Carrinho utilizando o template Empty MVC Controller. Em seguida, altere-o de acordo com o código a seguir.
7. Adicione uma tela associada à ação Index do controlador Carrinho com o seguinte conteúdo.
<ul >
@{
int i = 0;
foreach ( var produto in Model . Produtos )
{
<li >@produto . Nome ( @produto . Preco ) - @Html . ActionLink (“ Remover do carrinho “, “ Remover “, new { idx = i++ }) </li >
}
}
</ul >
71
SUMÁRIO
As aplicações estão sujeitas a erros de várias naturezas. Por exemplo, erros podem
ser gerados pelo preenchimento incorreto dos campos de um formulário. Esse tipo de
erro é causado por falhas dos usuários. Nesse caso, é importante mostrar mensagens in-
formativas com o intuito de fazer o próprio usuário corrigir os valores preenchidos in-
corretamente. Por outro lado, há erros que não são causados por falhas dos usuários. Por
exemplo, um erro de conexão com o banco de dados. Nesses casos, é improvável que os
usuários possam fazer algo que resolva o problema, e mesmo que pudessem, provavel-
Quando um erro desse tipo ocorre, o ASP.NET MVC cria uma página web com infor-
mações sobre o erro e a envia aos usuários. Para usuários locais, o ASP.NET MVC envia uma
página web com informações detalhadas do erro ocorrido, e para os usuários remotos, a pá-
Não é conveniente que os usuários recebam detalhes técnicos sobre os erros gerados
por falhas da aplicação. A primeira justificativa é que esses detalhes podem confundir os
usuários. A segunda justificativa é que esses detalhes podem expor alguma falha de segu-
TRY-CATCH
@{
Layout = null ;
Os erros de aplicação podem ser identificados através do comando }
try-catch, que podem ser colocados nos métodos que definem as ações dos
<! DOCTYPE html >
controladores. Ao identificar a ocorrência de um erro, os controladores po- <html >
dem devolver uma página web com alguma mensagem para o usuário. <head >
<title >Erro </ title >
</ head >
<body >
[ HttpPost ] <h2 >
public ActionResult Salva ( Editora editora ) Servidor com problemas
{ </h2 >
try <p>
{ Houve um problema em nosso servidor.<br/>
db.Editoras.Add( editora ); Por favor tente novamente dentro de alguns instantes.
} </p>
catch </ body >
{ </ html >
return View (“ Error “);
}
return RedirectToAction (“ Index “);
} As páginas de erro, que serão mostradas pelos controladores, teriam uma mensagem simples in-
formando que houve um erro na aplicação e que não é possível atender a requisição do usuário naquele
Podemos criar uma página Error.cshtml na pasta Views\Shared. Dessa momento. Inclusive, seria conveniente padronizar a página de erro. Em outras palavras, todos os contro-
forma, todo controlador poderá devolver essa página. ladores teriam que mostrar a mesma página.
CUSTOM ERRORS Por convenção, o ASP.NETMVC mantém uma página de erro padrão dentro da pasta Views\Shared
com o nome Error.cshtml. Vamos alterar este arquivo. O conteúdo da página de erro é basicamente HTML.
On: a página de erro padrão será enviada para usuários locais e remotos.
Um dos erros mais conhecidos do HTTP é o 404, que ocorre quando o navegador faz uma
Off: a página de erro detalhada será enviada para usuários locais e remotos.
requisição para uma URL que não existe. Esse erro é gerado por falhas dos usuários, ao tentarem
RemoteOnly: a página de erro detalhada será enviada para os usuários locais digitar diretamente uma URL na barra de endereço dos navegadores, ou por links ou botões “que-
Quando o erro 404 ocorre, o ASP.NET MVC utiliza a página padrão, para erros de aplicação, De acordo com o código anterior, devemos definir um controlador chamado
configurada no Web.config através da tag <customErrors>. Porém, esse erro não deve ser consi- ErrorPage com uma ação chamada NotFound. Essa ação será acionada toda vez que o
derado um erro de aplicação, pois pode ser gerado por falhas do usuário. Ele também não deve ser erro 404 do HTTP ocorrer.
considerado um erro de usuário, pois pode ser gerado por falhas da aplicação. Consequentemente,
é comum tratar o erro 404 de maneira particular, criando uma página de erro específica para ele. namespace FTEC.Controllers
{
public class ErrorPageController : Controller
{
@{
public ActionResult NotFound ()
Layout = null ;
{
}
return View ();
}
<! DOCTYPE html >
}
<html >
}
<head >
<title >Arquivo não encontrado !</ title >
</ head >
<body >
<h2 >Esse arquivo não foi encontrado . Verifique se a url está correta .</h2 >
</ body >
</ html >
No arquivo de configuração, podemos especificar uma página web particular para o erro 404 ou
...
< customErrors mode =”On”>
<error statusCode =”404 “ redirect =”~/ ErrorPage / NotFound “/>
</ customErrors >
...
1. Crie um projeto do tipo ASP.NET web application chamado TratamentoDeErros no Visual Studio. Utilize o template MVC.
3. Trate o erro do exercício anterior com o bloco try-catch e redirecione o usuário para uma tela com a seguinte mensa-
...
public ActionResult TestaErro ()
{
try
{
string [] nomes = new string [] { “ Jonas Hirata “, “ Rafael Cosentino “ };
string nome = nomes [2];
return View ();
}
catch
{
return View (“ Error “);
}
}
...
@{
Layout = null ;
}
6. Remova o bloco try-catch da ação TestaErro do controlador Teste que você adicionou no exercício anterior.
7. Altere o arquivo Web.config, para configurar o ASP.NET MVC, para utilizar páginas de erro padrão.
...
<system.web >
< customErrors mode =”On”></ customErrors >
...
<system.web >
...
8. Vamos definir uma página para ser exibida quando o erro 404 ocorrer. Crie um controlador chamado ErrorPage com uma ação
chamada NotFound.
namespace TratamentoDeErros.Controllers
{
public class ErrorPageController : Controller
{
public ActionResult NotFound ()
{
return View ();
}
}
}
9. Na pasta Views\ErrorPage do projeto Erros, adicione um arquivo chamado NotFound.cshtml com o seguinte conteúdo.
@{
Layout = null ;
}
10. Altere o arquivo Web.Config para definir que, quando um erro 404 ocorrer, a página exibida deve ser aquela que acabamos de criar.
...
<system.web >
< customErrors mode =”On”>
<error statusCode =”404 “ redirect =”~/ ErrorPage/NotFound “/>
</ customErrors >
...
<system.web >
...