Download - Treinamento Asp.net MVC (S2B) PUC Minas
![Page 1: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/1.jpg)
MicrosoftStudents to BusinessDesenvolvimento ASP.Net MVC – 2ª Fase
Professor: Herivelton Martins (MCP)[email protected]@hotmail.com
![Page 2: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/2.jpg)
Visão Geral sobre o Visual Studio 2015
Introdução do ASP.Net MVC
Banco de Dados
ADO.Net
Entity Framework e MVC
Camada de Apresentação
Camada de Controle
Validações \ Sessões \ Tratamento de Erros
Projeto Final
2ª Fase (Agenda)
![Page 3: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/3.jpg)
Visão Geral do Visual Studio 2015
![Page 4: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/4.jpg)
É uma ferramenta de desenvolvimento completa que atende praticamente a todas as plataformas de desenvolvimento, como:• Web• Windows/Client• Dispositivos Móveis (Windows Phone, Android e iOS)• Computação em Nuvem• Internet das Coisas - IoT
O que é o Visual Studio 2015?
![Page 5: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/5.jpg)
Hoje o Visual Studio 2015 possui 3 versões:
• Visual Studio Enterprise• Visual Studio Professional• Visual Studio Community Edition
A versão Community é totalmente gratuita e permite também a criação de todo tipode aplicação.
O Visual Studio pode também ser utilizado na versão Português
Faça o download no site: http://www.visualstudio.com/
Visual Studio 2015
![Page 6: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/6.jpg)
O Visual Studio suporta uma infinidade de linguagens, mas nativamente, quando você instala a ferramenta, nós temos:
• C#• Visual Basic• Visual C++• Visual F#
Visual Studio - Linguagens
![Page 7: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/7.jpg)
Este é um exemplo de código escrito com C#
Visual Studio – C#
![Page 8: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/8.jpg)
Podemos desenvolver para web com Visual Studio, através de templates, que são modelos de aplicações utilizáveis e que agilizam o processo de desenvolvimento.
Hoje podemos criar aplicações:• WebForms• Asp.Net MVC• Asp.Net WebAPI• HTML / CSS / Javascript
Visual Studio – Desenvolvimento Web
![Page 9: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/9.jpg)
Podemos desenvolver aplicações para Windows Client, ou seja, programas que irão funcionar no desktop, como por exemplo o Word; Para isto o Visual Studio nos oferece algumas maneiras de criar este tipo de aplicação:
• Windows Forms – formato mais tradicional de aplicações• WPF – permite criarmos interfaces mais ricas e interessantes• Universal App – usa WPF permite criar aplicações que irão
funcionar em todos os Dispositivos com Windows: Desktop,Telefone, Xbox, IoT, etc.
Visual Studio – Windows
![Page 10: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/10.jpg)
Temos diversas ferramentas integradas ao Visual Studio, que auxiliam o desenvolvimento e tornam o desenvolvedor muito mais produtivo, por exemplo:
• Nuvem do Microsoft Azure totalmente integrado• Gerenciamento do Ciclo de Vida das Aplicações (ALM) com Visual
Studio Online e Team Foundation Server• Integração com GitHub, um dos maiores portais de código open
source• Gerenciamento de Banco de Dados SQL integrado• Emuladores de dispositivos como Windows Phone e até mesmo
Android• Publicação de aplicações web diretamente na nuvem
Visual Studio – Ferramentas
![Page 11: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/11.jpg)
ASP.Net Visão em Alto Nível
![Page 12: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/12.jpg)
Visual Studio – Framework .Net
![Page 13: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/13.jpg)
Universal Windows Platform (UWP)Multiplataforma
![Page 14: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/14.jpg)
Visual Studio – Ferramentas - SQL
Integração com SQL Server
![Page 15: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/15.jpg)
Visual Studio – Ferramentas – Emulador AndroidEmulador Android Nativo
![Page 16: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/16.jpg)
Visual C#
![Page 17: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/17.jpg)
Visual C#
Linguagem moderna de alto nível implementada pela Microsoft para ser usada no Microsoft VisualStudio
Multi-propósito• Apps• Desktop• Embarcados• Web
Foco em simplicidade, orientação à objetos e poder computacional
Atualmente na versão 6, onde o compilador foi totalmente reescrito (em C#) abriu muitas possibilidades, como por exemplo escrever analisadores estáticos de código
![Page 18: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/18.jpg)
Visual C#
A linguagem (e o .NET Framework) suportam uma variedade de conceitos e estilos de programação
• Orientação a Objetos• Tarefas Assíncronas• Atributos e Propriedades• Coleções de Objetos• Iteradores• Reflexão e Binding• Threading• Serialização
![Page 19: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/19.jpg)
Tipos de Dados
![Page 20: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/20.jpg)
Tipos de Dados
C# é uma linguagem fortemente “tipada” - isso significa que os métodos, variáveis e constantesprecisam ser descritas através de um tipo de dado antes de serem utilizadas
Cada tipo de dado possui características como• Tamanho de Armazenamento• Valores Iniciais• Valores Máximos e Mínimos• Operações
![Page 21: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/21.jpg)
Tipos de Dados
Tipos Integrais (Inteiros)
TIpo Tamanho Menor Valor Maior Valor Valor Inicial Classificação
sbyte 8 bits com sinal ‐128 127 0 Valor
Byte 8 bits sem sinal 0 255 0 Valor
char 16 bits U + 0000 para FFFF + U ‘\0’ Valor
short 16 bits com sinal ‐32.768 a 32.767 0 Valor
ushort 16 bits sem sinal 0 65.535 0 Valor
int 32 bits com sinal ‐2.147.483.648 2.147.483.647 0 Valor
uint 32 bits sem sinal 0 4,294,967,295 0 Valor
Long 64 bits com sinal ‐9,223,372,036,854,775,808 9.223.372.036.854.775.807 0L Valor
ulong 64 bits sem sinal 0 18,446,744,073,709,551,615 0 Valor
![Page 22: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/22.jpg)
Tipos de Dados
Ponto Flutuante
Tipo Tamanho Menor Valor Maior Valor Padrão Classificação
float 32 bits 0.0F 0.0F Valor
double 64 bits 0.0D 0.0D Valor
Cadeia de CaracteresTipo Tamanho Valor Padrão Classificação
String até 2 GB (depende da plataforma e do hardware) null Referência
![Page 23: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/23.jpg)
Exercício
1. Criei uma Solution no Visual Studio 2. Dentro de uma classe defina as seguintes variráveis:• Id: Integer• Nome: String• Preco: DecimalVerifique a propriedades.
![Page 24: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/24.jpg)
Introdução ao ASP.Net MVC
![Page 25: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/25.jpg)
Visual Studio – Asp.Net MVC
No modelo Asp.Net MVC a aplicação é dividida em 3 partes:• Model – que contém os dados, por exemplo o acesso a um banco
de dados• View – é a parte que o usuário verá no browser. No Visual Studio
trabalhamos com a engine Razor, que é um misto de C# com HTML• Controller – faz a ligação entre o modelo e a view, executando
ações do usuário
![Page 26: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/26.jpg)
ASP.Net MVC Web Project Template
![Page 27: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/27.jpg)
Visual Studio – Desenvolvimento Web
Exemplo de Código MVC - Controller
![Page 28: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/28.jpg)
Visual Studio – Desenvolvimento Web
Exemplo de Código MVC - View
![Page 29: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/29.jpg)
Arquivos de Projeto e Configuração
![Page 30: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/30.jpg)
Exercícios• Crie um projeto Asp.Net MVC e observe a estrutura de arquivos e pastas
![Page 31: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/31.jpg)
Banco de Dados
![Page 32: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/32.jpg)
SQL Server
Faça o download da versão SQL Server Express em:
https://www.microsoft.com/pt-br/download/details.aspx?id=42299
![Page 33: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/33.jpg)
SQL Server
O Visual Studio 2015 permite você criar um SQL Server Database:
* Arquivo de Banco de Dados Local
![Page 34: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/34.jpg)
DataBases
Criando uma nova Base de Dados: DBLojaVirtual
![Page 35: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/35.jpg)
Criando a Base de Dados DBLojaVirtual
![Page 36: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/36.jpg)
Base de Dados Criada
![Page 37: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/37.jpg)
TabelasCrie as seguintes TABELAS no banco de dados DBLojaVirtual:
Categorias ProdutosColuna Tipo Coluna TipoCategoriaID (PK) Integer ProdutoID (PK) IntegerNome Varchar(100) Nome Varchar(100)
Descricao Varchar(255)Preco Decimal(10,2)CatogoriaID (FK) Integer
![Page 38: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/38.jpg)
Adicionando novas tabelas
![Page 39: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/39.jpg)
Tabela: CategoriasCrie a tabela: Categorias
![Page 40: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/40.jpg)
Tabela: ProdutosCrie a tabela: Produtos
![Page 41: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/41.jpg)
CRUDInserindo alguns registros na tabela de categoria e produtos
![Page 42: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/42.jpg)
Consultando os dados
![Page 43: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/43.jpg)
Atualizando os Dados
![Page 44: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/44.jpg)
Exercícios1. Crie um novo projeto Asp.Net MVC chamado “Livraria”2. Crie um Banco de Dados chamado “DBLivraria”3. Crie duas Tabelas: • Editora• Campos(EditoraID, Nome) Livro Campos (LivroId, Titulo, Autor, Editora_EditoraId*) *FK• Realize a Inserção, Consulta, Atualização e Remoção de Registros destas Tabelas
![Page 45: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/45.jpg)
ADO.NET
![Page 46: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/46.jpg)
ADO.NET
ADO.NET (ActiveX Data Objects) consiste num conjunto de classes definidas pela . NET framework (localizadas no namespace System.Data) que pode ser utilizado para aceder aos dados armazenados numa base de dados remota.
![Page 47: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/47.jpg)
Drivers
Geralmente, protocolos binários são mais apropriados para reduzir o tamanho das mensagens e consequentementediminuir a carga do canal de comunicação. Por isso, osSGDBs utilizam protocolos binários.
Para resolver esse problema e facilitar o desenvolvimento das aplicações, as empresas proprietá-rias dos SGDBs, normalmente, desenvolvem e distribuem drivers de conexão. Um driver de conexão atua como um intermediário entre as aplicações e os SGDBs.
![Page 48: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/48.jpg)
ODBC
Para facilitar o trabalho do desenvolvedor da aplicação, a Microsoft® definiu uma especificação chamada ODBC(Open Database Connectivity) para padronizar a interface dos drivers de conexão. Assim, quando uma empresa proprietária de um banco de dados pretende desenvolver um driver, ela segue essa especificação com o intuito de popularizá-lo.
![Page 49: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/49.jpg)
Criando uma conexão ODBC
string string De Conexao = @" driver ={ SQL Server };server = LOCALHOST\SQLEXPRESS; database = DBLojaVirtual;uid = sa;pwd=sa;";
string string De Conexao = @"driver ={ SQL Server };server = LOCALHOST\SQLEXPRESS; database = DBLojaVirtual;Integrated; Security=True";
String de Conexão
![Page 50: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/50.jpg)
OBDC ConnectionOdbcConnection: Utiliza a classe System.Data.Odbc.OdbcConnection do .NET Framework
Odbc Connection conexao = new Odbc Connection ( string De Conexao );
![Page 51: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/51.jpg)
Inserindo registros via ODBCInserir um novo registro na categoria câmera
string texto Do Comando = @" INSERT INTO Categorias ( Nome)VALUES (‘Câmeras’);";
Odbc Command comando = new Odbc Command ( texto Do Comando , conexao );
conexao . Open ();comando . Execute Non Query ();
Mais Sobre
O caractere “@” antes de um valor literal do tipo string indica que os caracteres dentro da string não devem ser processados como caracteres especiais.
![Page 52: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/52.jpg)
Encerrando conexão ODBCFinalizando uma conexão ODBC
Importante
A mesma conexão pode ser reaproveitada para executar várias operações. Quando não houver mais operações a serem executadas, devemos finalizar a conexão ODBC através
do método Close(). Finalizar as conexões ODBC que não são mais necessárias é importante pois libera recursos no SGBD.
conexao.close();
OU
Using (OdbcConnection conexao = new OdbcConnection(stringConexao)){
// Utiliza a conexão}
![Page 53: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/53.jpg)
Criando uma conexão ODBC completaInserindo um registro via ODBC
![Page 54: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/54.jpg)
SQL Injection X Parameters
A implementação da inserção de registros feita anteriormente possui uma falha grave. Os dados obtidos do usuário através do teclado não são tratados antes de serem enviados para o SGDB.Solução:
![Page 55: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/55.jpg)
OdbcDataReader
![Page 56: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/56.jpg)
Exercícios1. Utilize projeto Asp.Net Empty (Vazio) chamado “Livraria”2. Crie uma classe para realizar Inserção, Consulta via ODBC:• Editora Campos(EditoraID, Nome) Livro Campos (LivroId, Titulo, Autor, Editora_EditoraId*) *FK
![Page 57: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/57.jpg)
Entity Framework
![Page 58: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/58.jpg)
Entity FrameworkUtilizando conexões ODBC para fazer uma aplicação C# interagir com os SGDBs. As consultas são definidas com a linguagem SQL. A sintaxe dessa linguagem é diferenteem cada SGDB.
SELECT TOP 100 * FROM produtos ORDER BY autor ASC
SELECT * FROM ( SELECTROW_NUMBER() OVER (ORDER BY nome ASC) AS rownumber, ProdutoId, nome, descricaoFROM produtos) WHERE rownumber <= 100
Sintaxe SQL Server
Sintaxe Oracle (PL SQL)
![Page 59: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/59.jpg)
Orientação a Objetos VS Modelo Relacional
Outro problema na comunicação entre uma aplicação C# e um SGDB é o conflito de paradigmas. Os SGDBs são organizados seguindo o modelo relacional. Por outro lado, as aplicações C# utilizam o modelo orientado a objetos.
![Page 60: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/60.jpg)
Ferramentas ORM
Para facilitar a comunicação entre aplicações C# que seguem o modelo orientado a objetos e os SGDBs que seguem o modelo relacional, podemos utilizar ferramentas que automatizam a transição de dados entre as aplicações e os SGDBs. Essas ferramentas são conhecidas como ferramentas ORM (Object Relational Mapper).
As principais ferra- mentas ORM para C# utilizadas no mercado são o Entity Framework e o NHibernate. Nessecurso, utilizaremos o Entity Framework 5.0.0.
![Page 61: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/61.jpg)
Como funciona o Entity Framework?
DB
ORM
Entities in Code
![Page 62: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/62.jpg)
Instalando o Entity Framework
A instalação do Entity Framework em um projeto do Visual Studio 2012 podeser facilmente realizada através do Package Manager Console. Veja o comando de instalação a seguir.
PM > Install - Package Entity Framework - Version 5.0.0Terminal: Package Manager Console
Mais SobreO Entity Framework também pode ser instalado através do Manage NuGet Packages. Basicamente, o Manage NuGet Packages é a alternativa visual ao Package ManagerConsole.
![Page 63: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/63.jpg)
Instalando o Entity Framework
1
2
![Page 64: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/64.jpg)
Configuração
O Entity Framework é fortemente baseado no conceito de “Convenção sobre Configuração”. Dessa forma, nenhuma configuração é necessária a não ser que seja necessário alterar o comportamento padrão.
<? xml version =" 1.0 " ?>< configuration >< connection Strings ><add name="DefaultConnection"
connectionString="Data Source=(LocalDb)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\DBLoja.mdf;Initial Catalog=DBLoja;Integrated Security=True" providerName="System.Data.SqlClient" />
</ connection Strings ></ configuration >
XML do Arquivo de Configuração Web.Config
![Page 65: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/65.jpg)
Convenções de Mapeamento
Por padrão, no Entity Framework, o mapeamento das entidades segue as regras do Code First.
Classe (Model): Categoria.cs
Classe (Model): Produto.cs
![Page 66: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/66.jpg)
Registrar entidades no DBContextAs entidades devem ser “registradas” em um DbContext. Para registrar uma entidade, basta definir uma propriedade do tipo DbSet. Veja o exemplo abaixo.
Classe: LojaVirtualDBContext.cs
De acordo com as convenções do Code First, as entidades Categoria e Produto serão mapeadas para tabelas chamadas Categorias e Produtos respectivamente.
Além disso, por padrão, essas tabelas serão criadas em uma base de dados chamada EF.LojaVirtualDBContext.Esse nome corresponde ao full qualified name da classe LojaVirtualDBContext
![Page 67: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/67.jpg)
Desabilitar a pluralização aos Nomes de Tabelas
Para desabilitar a pluralização aplicada no nome das tabelas, é necessário sobrescrever o método OnModelCreating() da classe DbContext.
LojaVirtualDBContext.cs
![Page 68: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/68.jpg)
Personalizando a Base de Dados no DBContext
Podemos modificar o nome da base de dados escolhido por padrão. Para isso, basta adicionar um construtor na classe que define o DbContextsemelhante ao mostrado no código abaixo.
LojaVirtualDBContext.cs
![Page 69: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/69.jpg)
Primary KeyO Entity Framework assumirá como identificador de uma entidade, a propriedade cujo nome seja ID ou EntidadeID escrito com letras maiúsculas e/ou minúsculas. Essa propriedade será mapeada para uma coluna definida no banco de dados como chave primária da tabela correspondente a entidade.
Classe (Model): Categoria.cs
Classe (Model): Produto.cs
![Page 70: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/70.jpg)
Complex TypesConsidere a seguinte entidade.
Contato.cs
![Page 71: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/71.jpg)
Complex Types
Do ponto de vista da modelagem orientada a objetos, deveríamos refatorar essa classe separando as propriedades relacionadas aos endereços de um contato.
Contato.cs
Endereco.cs
![Page 72: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/72.jpg)
Complex TypeComo nenhuma propriedade da classe Endereco se enquadra nas convenções de Primary Key e supondo que nenhuma propriedade tenha sido mapeada explicitamente para uma coluna definida como chave primária, o Entity Framework assumirá que essa classe é um Complex Type. Além disso, um Complex Type não pode referenciar uma entidade através de uma propriedade.As classes Contato e Endereco serão mapeadas para uma única tabela chamada Contatoes. Essa tabela possuirá a estrutura mostrada na imagem a seguir.
Mapeamento das classes Contato e Endereco
![Page 73: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/73.jpg)
Mapeamento dos Relacionamentos
Classe (Model): Categoria.cs
Classe (Model): Produto.cs
As mesmas tabelas seriam obtidas se o relacionamento fosse definido na entidade Categoria ao invés de ser definido na entidade Produto.
![Page 74: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/74.jpg)
Essas duas entidades serão mapeadas para as tabelas Produtos e Categorias. Na tabela Produtos, será adicionada uma chave estrangeira chamada Categoria_CategoriaIDreferenciado a chave primária da tabela Categoria. Observe na imagem abaixo a estrutura das tabelas.
Tabelas DBLojaVirtual
![Page 75: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/75.jpg)
Type DiscoveryQuando duas entidades estão relacionadas, não é necessário que ambas sejam “registradas” no DbContext. Apenas a entidade principal necessita ser registrada.Exemplo: Categorias
Se as duas entidades forem registradas, tanto os Produtos quanto as Categorias podemser obtidos diretamente pelo DbContext.
![Page 76: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/76.jpg)
Exercícios1. Crie um novo projeto Asp.Net MVC chamado “Livraria”2. Crie duas Entidades: • Editora Campos(EditoraID, Nome)• Livro Campos (LivroId, Titulo, Autor, Editora_EditoraId*) *FK Realize a criação do DBContext e demais itens semelhante a aula anterior.
![Page 77: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/77.jpg)
Data Annotations
ValidationAttributes: Derivam da classe ValidationAttribute e são usados para garantir regras de validação que podem ser aplicadas a classes ou membros.
DisplayAttributes: Usados para especificar como os dados de uma classe ou membro são exibidos.
Data Modeling Attributes: Usados para especificar a estrutura e o relacionamento entre classes de dados (muito utilizados no EntityFramework Code First).
![Page 78: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/78.jpg)
Data Annotations
Podemos utilizar anotações para sobrescrever as convenções de mapeamento. A seguir apresentaremos as principais anotações.
Table e Column
Aluno.cs
Tabela e colunas geradas no Banco de Dados
![Page 79: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/79.jpg)
Data AnnotationsA anotação Column também permite a escolha do tipo da coluna correspondente à propriedade anotada.
Coluna personalizada usando Data Annotations
Produto.cs
![Page 80: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/80.jpg)
DatabaseGeneratedPor padrão, quando a propriedade correspondente à chave primária de uma tabela é numérica, os valores dessa chave serão gerados pelo banco de dados. Podemos alterar esse comportamento através da anotação DatabaseGenerated.
Aluno.cs
![Page 81: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/81.jpg)
KeyConsidere a seguinte classe.Nenhuma propriedade se enquadra nas convenções de nomenclatura de chave primária. Con- tudo, é possível definir explicitamente, qual propriedade será mapeada como chaveprimária através da anotação Key.
Aluno.cs
Show Potential Fixes: Sugere inclusão da referênciaColuna criada como Identity no banco de dados
![Page 82: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/82.jpg)
RequiredUma propriedade pode ser definida explicitamente como obrigatória através da anotação Requi- red. No banco de dados, as colunas correspondentes às propriedades obrigatórias serão definidas com a opção not null.
Aluno.cs
![Page 83: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/83.jpg)
MaxLength e MinLengthDefinindo a quantidade mínima e máxima de caracteres de uma propriedade
Aluno.cs
Tabela a ser gerada com mapeamento do tamanho
![Page 84: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/84.jpg)
NotMapped
Observe que a propriedade Idade pode ser calculada a partir da propriedade DataDeNascimento. Portanto, não é necessário armazenar o valor da idade no banco de dados.
Aluno.cs
Tabela Sem o campo não mapeado
![Page 85: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/85.jpg)
InversePropertyConsidere as seguintes entidades.
Pessoa.cs
Livro.cs
![Page 86: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/86.jpg)
Nesse caso, como o Entity Framework não consegue combinar as propriedades das duas entidades para estabelecer dois relacionamentos bidirecionais, ele criará no banco de dados quatro chaves estrangeiras, uma para cada propriedade de navegação das entidades Pessoa e Livro.
Relacionamento não combinados
![Page 87: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/87.jpg)
InversePropertyPara agrupar as propriedades de navegação das entidades Pessoa e Livro, devemos utilizar a anotação InverseProperty. Observe o código a seguir.
Pessoa.cs
Livro.cs
![Page 88: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/88.jpg)
Inverse Property (Agrupando)
Relacionamentos combinados com InverseProperty
![Page 89: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/89.jpg)
Exercícios
![Page 90: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/90.jpg)
DBContextAs instâncias das entidades de uma aplicação que utiliza o Entity Framework são administradas por objetos do tipo DbContext. Esses objetos são responsáveis pelas operações de inserção, remoção, alteração e consulta. A seguir, mostraremos o funcionamento básico de um DbContext.
Utilizando um DBContext dentro de um bloco Using
![Page 91: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/91.jpg)
Persistindo
Para indicar que determinado objeto deve ser persistido no banco de dados, devemos utilizar o método System.Data.Entity.DbSet.Add(), passando o objeto em questão como parâmetro. O método Add() adiciona o objeto ao contexto com o estado Added.
Para armazenar de fato as informações de um objeto no banco de dados, utilizamos o método SaveChanges() do DbContext. Todos os objetos do contexto que estejam no estado Added são inseridos no banco de dados quando o método SaveChanges() é chamado.
![Page 92: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/92.jpg)
Persistindo (Cont.)
Persistindo um objeto
![Page 93: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/93.jpg)
Buscando
Para obter um objeto que contenha informações do banco de dados, basta utilizar o método Find() do DbSet. Devemos passar o identificador do objeto que desejamos recuperar como parâ-metro para esse método.
Buscando uma categoria com o identificador 1
![Page 94: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/94.jpg)
RemovendoPara indicar que determinado objeto deve ser removido, basta utilizar o método System.Data.Entity.DbSet.Remove(). Esse método marca o objeto para ser removido do banco de dados, colocando-o no estado Deleted.Quando o método SaveChanges() é chamado, todas os objetos no estado Deleted são removidos do banco de dados.
Remove o registro de Categoria
![Page 95: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/95.jpg)
AtualizandoPara alterar os dados do registro correspondente a um objeto, basta modificar as suas propriedades. Quando as propriedades de um objeto do contexto são alteradas, o estado Modified é associado a este objeto. Objetos no estado Modified são atualizados no banco de dados quando o método SaveChanges() é chamado.
Alterando o nome de uma categoria
![Page 96: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/96.jpg)
ListandoPara obter uma listagem com todos os objetos referentes aos registros de uma tabela, podemos utilizar a Language Integrated Query (LINQ), que nos permite escrever consultas dentro do código C#.
Utilizando LINQ para fazer uma consulta
![Page 97: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/97.jpg)
Exercícios1. Crie um novo projeto Asp.Net MVC chamado “Livraria”2. Crie uma classe nova chamada ManterAlunos.cs3. Crie métodos de consulta, inserção, atualização e exclusão de Livros Livros: Campos (LivroId, Titulo, Autor, Editora_EditoraId*) *FK
![Page 98: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/98.jpg)
Repositórios
As classes DbContext e DbSet do Entity Framework oferecem recursos suficientes para que os objetos do domínio sejam persistidos, recuperados, alterados e removidos do banco de dados. Porém, em aplicações com alta complexidade e grande quantidade de código, “espalhar” as chamadas aos métodos do DbContext e DbSet pode gerar dificuldades na manutenção e no entendimento do sistema.
![Page 99: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/99.jpg)
Repositórios (Cont.)
Para melhorar a organização das nossas aplicações, diminuindo o custo de manutenção e aumentando a legibilidade do código, podemos aplicar o padrão Repository do DDD (Domain Driven Design).
Conceitualmente, um repositório representa o conjunto de todos os objetos de um determinado tipo. Ele deve oferecer métodos para administrar seus elementos.
![Page 100: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/100.jpg)
Repositórios (Cont.)
Os repositórios podem trabalhar com objetos prontos na memória ou reconstruí-los com dados obtidos de um banco de dados. O acesso ao banco de dados pode ser realizado através de uma ferramenta ORM como o Entity Framework.
![Page 101: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/101.jpg)
Repositório (Cont.) Exemplo
CategoriaRepository.cs
![Page 102: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/102.jpg)
Code First Migrations
O Entity Framework Code First da Microsoft tem uma funcionalidade que permite controlar as mudanças no banco de dados que serão realizadas de acordo com as alterações na camada de mo- delo da aplicação. Essa funcionalidade é chamada de Code First Migrations.
Inclua o código abaixo na inicialização da aplicação
![Page 103: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/103.jpg)
Code First Migrations (Geração de objetos)
Após a execução do projeto, teremos a seguinte tabela e banco de dados.
Tabela de Categorias
* Altere a classe Produto.cs, incluindo um novo campo chamado “Quantidade” e execute a aplicação novamente
![Page 104: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/104.jpg)
Code First Migrations (Habilitando)Com a alteração na classe Categoria, um exceção é gerada ao executar o projeto.
Para resolver esse problema, o banco de dados precisa ser atualizado. Para fazer essa atualização, o Entity Framework recomenda a utilização da ferramenta Code FirstMigrations.
O primeiro passo para utilizar Code First Migrations é habilitá-lo e adicioná-lo ao projeto através do Package Manager Console.
![Page 105: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/105.jpg)
Code First Migrations
O comando Enable-Migrations adiciona uma pasta chamada Migrations no projeto. Esta pasta contém dois arquivos.
• A classe Configuration permite definir o comportamento do Code First Migrations para o nosso contexto.• A classe parcial InitialCreate define a primeira versão das tabelas do banco de dados.
![Page 106: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/106.jpg)
Code First Migrations (Comandos)
O Code First Migration tem dois comandos fundamentais.
• Add-Migration que gera o código necessário para atualizar o banco de dados de acordo com as alterações nas classes de modelo.• Update-Database aplica as alterações pendentes no banco de dados.
Execute o comando abaixo no Nuget:PM> Add-Migration AddQuantidadeToProduto
![Page 107: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/107.jpg)
Code First Migrations
A classe que define a migração é adicionada à pasta Migrations.
Para atualizar o banco de dados com as alterações definidas na Migration, devemos executar o comando Update-Database.PM> Update-Database
Uma nova coluna é adicionada à tabela Produtos no banco de dados.
![Page 108: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/108.jpg)
Exercícios
![Page 109: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/109.jpg)
Camada de Apresentação
![Page 110: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/110.jpg)
Camada de Apresentação
A camada de apresentação é responsável por gerar as páginas de uma aplicação web. Os dados apresentados em uma página web são definidos na camada de modelo. A camada de controle recupera os dados da camada de modelo e os envia para a camada de apresentação. Basicamente, a camada de apresentação definirá como esses dados serão apresentados para os usuários da aplicação.
![Page 111: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/111.jpg)
Exemplo de uma aplicação Web
Veremos a seguir um exemplo de uma simples aplicação web em ASP.NET MVC 4. Essa aplicação possuirá uma página principal que deverá exibir o seu número de visualização.
Primeiramente, criaremos um controlador para gerenciar o número de visualização da página principal. Os controladores são definidos por classes que derivam da classe Controller.
![Page 112: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/112.jpg)
Exemplo de uma aplicação Web
Os nomes dos controladores devem terminar com a palavra Controller. Além disso, eles devem ser definidos na pasta Controllers da aplicação. Considere a classe LojaVirtualControllerdefinida abaixo.
LojaVirtualController.cs
![Page 113: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/113.jpg)
Exemplo de aplicação Web
O método Index() será chamado toda vez que a urlhttp://<IP_SERVIDOR>:<PORTA_APP>/LojaVirtual/Index for requisitada por um navegador. Note que essa url é formada pelo nome do controlador (nome da classe que define o controlador sem o sufixo Controller) seguido pelo nome do método.
Para indicar que o fluxo de execução deve seguir para a camadade apresentação, o método Index() invoca o método View() e devolve a resposta obtida
![Page 114: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/114.jpg)
Exemplo de uma aplicação Web
Na camada de apresentação, vamos adicionar a página associada ao método Index(). Para isso, criaremos um arquivo chamado Index.cshtml na pasta Views\LojaVirtual\ da aplicação com o conteúdo abaixo.
Index.cshtml
Para acessar a ViewBag, devemos utilizar o caractere @, como no código acima.
![Page 115: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/115.jpg)
Integração com Entity Framework
A integração entre Entity Framework e ASP.NET MVC 4 é realizada de maneira extremamente simples. No Visual Studio 2015, ao criar um projeto ASP.NET MVC 4 do tipo Basic, a biblioteca do Entity Framework 5 é adicionada automaticamente.
As configurações padrões do Entity Framework podem ser alteradas através do arquivo Web.config. Por fim, bastaria implementar as entidades e mapeá-las como visto nos Capítulos anteriores
![Page 116: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/116.jpg)
Scaffold
O Visual Studio 2015 é capaz de gerar telas e controladores para as operações de inserção, leitura, alteração e remoção (CRUD) a partir de uma entidade de um projeto ASP.NET MVC 5. Os controladores gerados podem utilizar as funcionalidades do Entity Framework para interagir com o banco de dados.
![Page 117: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/117.jpg)
ScaffoldGerando a classe Controller
Gerando o Scaffold
![Page 118: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/118.jpg)
ScaffoldAdicionando o Controller
Gerando o Scaffold via Controller
![Page 119: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/119.jpg)
Scaffold
Gerando a Controller através de uma classe Model
Adicionando o Controller usando Scaffold
![Page 120: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/120.jpg)
Scaffold
Views Geradas automaticamente pelo Scaffold
Scaffold das Views gerado
Para testar, acesse o endereço:http://localhost:<PORTA_APP>/Produto/Index
![Page 121: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/121.jpg)
Exercícios
• Gere o scaffold da classe Model Categoria• Execute a aplicação• Acesse a página e verifique como está sendo apresentada
![Page 122: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/122.jpg)
Razor e ASPX
Até a segunda versão do ASP.NET MVC, as telas (ou páginas) de uma aplicação web eram de- senvolvidas em ASPX. A partir da terceira versão desse framework, podemos usar a linguagem Razor para construir essas telas.
Razor @{ ...}
Aspx <% %>
@{string nome = “Bill Gate”;
}
<p> Nome: @nome </p>
<%string nome = “Bill Gate”;
%>
<p> Nome: <%=nome%> </p>
![Page 123: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/123.jpg)
Condicionais (if e else)Podemos utilizar os comandos de controle de fluxo if e else. Veja os exemplos abaixo.
@* Comentários *@@if ( nome == “Bill Gates” ){<p> Homem Mais rico do Mundo!</ p>}else{<p> Continue trabalhando .</ p>}<! -- ou -->@{
string nome = “Bill Gates”;if( nome == “Bill Gates” ){<p> Homem Mais Rico do Mundo !</ p>}else{<p> Continue trabalhando .</ p>}
}
<% -- Comentários -- %><% if ( nome == “Bill Gates” ){%>
<p> Homem Mais rico do Mundo!</ p><%}else{%>
<p> Continue trabalhando .</ p><% } %>
Código da página em Razor
Código da página em ASPX
• Mesma regra para laços e outros operadores condicionais. Exemplo: for... While..
![Page 124: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/124.jpg)
Exercícios de Fixação
• Crie uma página Web utilizando Razor que imprima um laço (de 1 a 10) com números Randômicos na tela.
• Utilize o método Random() para gerar os números aleatórios na camada Controller
![Page 125: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/125.jpg)
ViewBag e Strogly Typed Views
A ViewBag é utilizada para transmitir dados da camada de controle para a camada de apresentação. Para adicionar um item à propriedade ViewBag, devemos definir uma chave para esse item. Veja o código abaixo.
ViewBag.HoraDoServidor = DateTime.Now.ToShortTimeString ();
Adicionando a ViewBag na classe do Controller
<p> A hora do servidor é @ViewBag.HoraDoServidor </p>
Acessando a ViewBag na classe do View
Desvantagem: não é possível garantir a existência dessas chaves em tempo de compilação
![Page 126: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/126.jpg)
Strongly typed viewsDefine tipo do objeto que será transferido da camada de controle para a camada de apresentação.
public Action Result Acao (){
Produto produto = new Produto { Nome = “iPhone 5s", Descricao = “iPhone 5s 32Gb“, preco = 1799.00 }; return View ( produto );
}
Passando um objeto para a camada de apresentação
Acessando um objeto da view
@using LojaVirtual.Models@model Produto
<p> Nome: @model.nome </p>
• Agora o compilador conhece o tipo do objeto transmitido
![Page 127: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/127.jpg)
Coleções de ObjetosVamos exibir uma coleção de objetos utilizando a classe ICollection
Adicione uma Action para listar os objetos na Controller ProdutoController.cs
![Page 128: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/128.jpg)
Criando a View
Exibindo o resultado da Action na tela para o usuário.O objeto Produto foi repassado e listado na tabela.
![Page 129: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/129.jpg)
Exercícios
• Crie um objeto do Tipo Produto na classe Controller de Produtos e passe este como objeto para ser acessado pela View
![Page 130: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/130.jpg)
HTML Helpers
![Page 131: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/131.jpg)
HTML Helpers
A função das páginas CSHTML é gerar hipertexto XHTML para enviar aos navegadores dos usuários. Os arquivos .cshtml misturam tags XHTML com scripts de servidor escritos em C#. Essa mistura pode prejudicar a legibilidade do código em alguns casos.
![Page 132: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/132.jpg)
HTML Helpers
Para facilitar a manutenção do código das páginas CSHTML, o ASP.NET MVC oferece os chamados HTML Helpers.A função de um HTML Helper é encapsular um código XHTML.
<a href ="/Produto/Index/">Lista de produtos</ a>
@Html.ActionLink("Listade produtos", " Index ", “Produto")Código link usando HTML Helper
Código para Link CSHTML comum
![Page 133: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/133.jpg)
ActionLink Helper
O helper ActionLink é utilizado para gerar os links das páginas de uma aplicação web. Esse helper pode ser utilizado de diversas maneiras. A forma mais simples de utilizá-lo é passar a ele dois parâmetros: o texto e a ação associados ao link desejado.
@Html.ActionLink(“Texto Exibido para o Usuário", “Action")Código link usando ActionLink. Usando o controlador Implícito
![Page 134: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/134.jpg)
ActionLink Helper
Podemos definir o controlador desejado explicitamente. Para isso, é necessário passar um terceiro parâmetro para o método ActionLink.
@Html.ActionLink(“Texto Exibido para o Usuário", “Action“, “Controlador”)Código link usando ActionLink. Usando o controlador Explícito
@Html.ActionLink(“Texto Exibido para o Usuário", “Action“, new { Inicio = 0, Final = 10 } )
Acrescenta parâmetros de URL
Também podemos passar parâmetros.
![Page 135: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/135.jpg)
Begin Form e EndForm Helpers
No ASP.NET MVC, há um conjunto de HTML Helpers para facilitar a criação de formulários nas páginas de uma aplicação web.Para criar um formulário, utilizamos o helper BeginForm. Para terminar um formulário, utiliza- mos o helperEndForm. Veja o exemplo a seguir.@{Html.BeginForm();}
<!-- elementos do formulário -->
@{Html.EndForm();}Utilizando o Helpers BeginForm e EndForm
![Page 136: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/136.jpg)
BeginForm com using
Também podemos utilizar o comando using para garantir que os formulários sejam fechados.Nesse caso, não é necessário adicionar o helper EndForm. @usgin(Html.BeginForm()){<!-- elementos do formulário -->}
Utilizando o BeginForm com using
@usgin(Html.BeginForm(“Action”, “Controlador”)){<!-- elementos do formulário -->}
Utilizando BeginForm e definindo a Action e o Controlador
![Page 137: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/137.jpg)
BeginForm
Por padrão, os formulários gerados pelo helper BeginForm fazemrequisições do tipo POST. Nesse caso, as ações associadas a essesformulários devem ser anotadas com HttpPost para indicar o tipode requisição HTTP esperado.
public class LojaVirtualDBController : Controller {
// POST : /LojaVirtual/Home[HttpPost]public ActionResultHome() {...return View ();}
}Anotando uma ação com HttpPost
![Page 138: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/138.jpg)
Controles HTML Helper
@Html.CheckBox(“Ativo", false) CheckBox
@Html.TextBox(“Nome", “Digito o nome do produto“) TextBox
@Html.TextArea(“Descricao", “Digite a descrição completa do produto”) TextArea
@Html.RadioButton(“Estado", “MG”, true)@Html.RadioButton(“Estado", “SP”, false)@Html.RadioButton(“Estado", “RJ”, false)
RadioButton
@Html.Hidden(“CategoriaId", 1) Hidden
![Page 139: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/139.jpg)
Controles HTML Helpers
@Html.Password(“Senha", “senha1234”) Password
Mais sobre:Os dados preenchidos nos elementos de um formulário são recuperados da ViewBag. Considere o código abaixo:
Caso exista uma chave chamada Nome na ViewBag, então o valor associado a essa chave será o valor inicial da caixa de texto. Podemos alterar esse comportamento, passando um segundo parâmetro para o helper TextBox, que será o valor inicial da caixa de texto. Observe o código a seguir.
Mais sobre:Os dados preenchidos nos elementos de um formulário são recuperados da ViewBag. Considere o código abaixo:
Caso exista uma chave chamada Nome na ViewBag, então o valor associado a essa chave será o valor inicial da caixa de texto. Podemos alterar esse comportamento, passando um segundo parâmetro para o helper TextBox, que será o valor inicial da caixa de texto. Observe o código a seguir.
@Html.TextBox(“Nome", “Nome inicial”)
@Html.TextBox(“Nome")
![Page 140: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/140.jpg)
Strongly Typed Helpers
A forma que os HTML Helpers foram aplicados não permite que o compilador verifique a existência das propriedades associadas aos elementos dos formulários.
O código anterior supõe que o objeto recebido como parâmetro pela ação associada ao formulário onde o checkbox foi inserido possua uma propriedade chamada Aceito. Essa propriedade pode não existir. Contudo, nenhum erro de compilação seria gerado nesse caso.
@Html.CheckBox(“Ativo", false)
![Page 141: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/141.jpg)
Strongly Typed Helpers
Para evitar esse tipo de problema, podemos utilizar a seguinte sintaxe em telas fortemente tipadas:
@model [email protected](c => c.Ativo)...
Com essa sintaxe, o compilador tem condições de verificar a existência das propriedades. Sendo assim, ele produzirá um erro de compilação se uma propriedade inexistente for utilizada.
![Page 142: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/142.jpg)
Strongly Typed Helpers
@Html.CheckBoxFor(c => c.Ativo) CheckBox
@Html.TextBoxFor(c => c.Nome) TextBox
@Html.TextAreaFor(c => c.Descricao) TextArea
@Html.RadioButtonFor(x => x.Estado, “MG”)@Html.RadioButtonFor(x => x.Estado, “SP”)@Html.RadioButtonFor(x => x.Estado, “RJ”)
RadioButton
@Html.HiddenFor(e => e.CategoriaId) Hidden
![Page 143: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/143.jpg)
Strongly Typed Helpers
@Html.PasswordFor(c => x.Senha) Password
Mais sobre:Os dados preenchidos nos elementos de um formulário de uma tela fortemente tipada são recuperados da propriedade Model. Considere o código abaixo:
Caso exista a propriedade Model.Nome, o valor inicial dessa caixa de texto será o valor dessa propriedade.
Mais sobre:Os dados preenchidos nos elementos de um formulário de uma tela fortemente tipada são recuperados da propriedade Model. Considere o código abaixo:
Caso exista a propriedade Model.Nome, o valor inicial dessa caixa de texto será o valor dessa propriedade.
@Html.TextBoxFor(c => c.Nome)
![Page 144: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/144.jpg)
DropDownList Helper
Quando um produto é cadastrado, o usuário podem escolher a categoria deste produto. A categoria pode ser selecionada através de um DropDownList. Para criar um DropDownList, podemos utilizar o HTML Helper DropDownList.cshtmlO primeiro passo para utilizar o helper DropDownListé criar uma SelectList na camada de controle com as opções que o usuário poderá selecionar.
![Page 145: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/145.jpg)
O segundo passo é adicionar o helper DropDownList na camada de apresentaçã[email protected](“Categorias”)
Utilizando o DropDownList na tela .cshtml
public class ProdutoController : Controller{
public ActionResult Create(){
List<Categoria> categorias = db.Categorias.ToList();ViewBag.Categorias = new SelectList(categorias, "CategoriaId", "Nome"); return View();
}}
![Page 146: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/146.jpg)
EditorFor
Para cada propriedade da entidade Produto, utilizamos um helper para gerar o código HTML necessário para a entrada de dados. Por exemplo, no caso das propriedades Nome e Preco, utilizamos o HelperTextBox. Para a propriedade booleana Ativo, utilizamos o helper CheckBox
![Page 147: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/147.jpg)
Usando o EditorFor
Observe que a escolha do helperdepende basicamente do tipo da propriedade associada a ele. Podemos deixar essa escolha a cargo do helper EditorFor. Para propriedades de tipo booleano, esse helper utilizará o CheckBox. Para propriedades do tipo string, esse helper utilizará o TextBox.
![Page 148: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/148.jpg)
EditorForModel
Também temos o helperEditorForModel para construir um formulário completo com base nas propriedades de uma entidade. Esse helper seguirá a mesma abordagem do EditorFor. Ou seja, para cada propriedade do Model, ele utilizará o helper apropriado.
CSHTML: Página de Edição de Produto usando EditorForModel()
![Page 149: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/149.jpg)
Personalizando o EditorForModel
Para personalizar o funcionamento do helper EditorFor e do EditorForModel, podemos utilizar algumas anotações. Veja o exemplo abaixo.
![Page 150: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/150.jpg)
Exercícios
![Page 151: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/151.jpg)
Layouts
É comum que as páginas de uma aplicação web possuam conteúdo em comum (por exemplo, um cabeçalho ou um rodapé). O conteúdo em comum pode ser replicado em todas as páginas através do CTRL+C e CTRL+V. Porém, essa não é uma boa abordagem, pois quando alguma alteração precisa 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. Daí surge o conceito de Layouts.
![Page 152: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/152.jpg)
Layouts
Tudo que é comum a todas as páginas de um determinado grupo pode ser definido em um Layout. Dessa forma, qualquer alteração é facilmente realizada modificando-se apenas um arquivo.
Layout.cshtml
![Page 153: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/153.jpg)
Layout
No layout definido 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 onde o conteúdo definido em cada página será adicionado.É recomendado que os arquivos que definam layouts sejam colocados na pasta Views\Share.
![Page 154: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/154.jpg)
Layout
O ASP.NET MVC 4 possui um mecanismo capaz de agrupar o conteúdo CSS de diversos arquivos dinamicamente. Para usar esse mecanismo, basta invocar o método Render() da propriedade Styles.
Analogamente, a propriedade Scripts possui o método Render(), que também tem por obje- tivo agrupar o código JavaScript de diversos arquivos.
@Styles.Render("~/Content/Site.css“, "~/Content/Arquivo1.css“, "~/Content/Arquivo2.css“, "~/Content/Arquivo2.css“)
Incluindo vários arquivos CSS via Styles.Render()
![Page 155: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/155.jpg)
RenderBody
Quando a página de edição de produtos é requisitada, o arquivo Alterar.cshtml é processado antes do arquivo Layout.cshtml, o que permite definir o valor de ViewBag.Title no arquivo Alterar.cshtml e utilizá-lo no layout.
![Page 156: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/156.jpg)
_ViewStart
Para definir o layout de Alterar.cshtml, foi necessário armazenar o caminho completo do arquivo que define o layout na propriedade Layout. Para definir um layout padrão para todas as páginas, basta acrescentarmos o arquivo _ViewStart.cshtml à pasta View.
@{Layout = "~/Views/Shared/ Layout.cshtml ";
}
_ViewStart.cshtml
![Page 157: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/157.jpg)
Lacunas
Também podemos criar seções em um layout para serem preenchidas com conteúdos específicos definidos nas páginas. Considere o seguinte layout.
Opcional:
@if ( IsSectionDefined ("SideBar"))
Opcional:
@if ( IsSectionDefined ("SideBar"))
![Page 158: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/158.jpg)
RenderSection
Para definir o conteúdo de uma seção, devemos utilizar o código @section. Observe o código de uma página que utiliza o layout criado anteriormente e define a seção Sidebar.
Alterar.cshtml
![Page 159: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/159.jpg)
Exercícios
![Page 160: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/160.jpg)
Partial Views
Quanto mais elaborada é uma página de uma aplicação web, mais extenso é o seu código. Códigos muito extensos prejudicam a legibilidade e a manutenção da aplicação. Para organizar melhor o código, podemos dividir o conteúdo de uma página web em vários arquivos.Suponha que desejamos dividir o conteúdo de uma página em duas partes. Devemos criar um arquivo para cada parte.
< h1 > Parte 1 </ h><p> Conteúdo da parte1 </ p>
_Parte1.cshtml
< h1 > Parte 2 </ h><p> Conteúdo da parte2 </ p>
_Parte2.cshtml
![Page 161: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/161.jpg)
Partial Views
Por fim, devemos criar um arquivo principal para agrupar essas partes. Utilizaremos o métodoPartial() para inserir o conteúdo dos arquivos secundários no arquivo principal.
<html><head>
<title>Exemplo de partial</title></head>
<body>@Html.Partial("_Parte1")@Html.Partial("_Parte2")
</body></html>
Principal.cshtml
![Page 162: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/162.jpg)
Exemplo: Partial Views
Unificando as páginas Edit.cshtml e Create.cshtml Crie uma partial view com o conteúdo comum entre as duas páginas Insira a Partial View nas duas páginas Crie uma partial view usando foreach e passando o objeto como
parâmetro
![Page 163: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/163.jpg)
Camada de Controle
![Page 164: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/164.jpg)
Camada de Controle
No ASP.NET MVC as urls são mapeadas para métodos (ações) em classes que definem os chamadas controladores. As requisições enviadas pelos navegadores são processadas pelos controladores.
![Page 165: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/165.jpg)
Camada de Controle
O processamento realizado por um controlador para tratar uma requisição consiste basicamente em:
• Recuperar os dados enviados pelo usuário através de formulários.• Interagir com a camada de modelo.• Acionar a camada de apresentação para construir a página HTML que deve ser enviada para o usuário como resposta à sua requisição.
![Page 166: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/166.jpg)
Camada de Controle
Para que uma classe seja considerada um controlador, ela deve seguir algumas regras.
• O nome da classe deve ter o sufixo “Controller”.• A classe deve implementar a interface System.Web.Mvc.IController ou herdar da classe System.Web.Mvc.Controller.
![Page 167: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/167.jpg)
Actions
As ações são utilizadas para processar as requisições realiza- das pelos navegadores. Para criar uma ação, é necessário definir um método public dentro da classe de um controlador. Os parâmetros desse método podem ser utilizados para receber os dados enviados pelos usuários através de formulários HTML. Esse método deve devolver um ActionResult que será utilizado pelo ASP.NET MVC para definir o que deve ser executado depois que a ação terminar.
![Page 168: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/168.jpg)
Actions
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 realizada. Essa tabela é definida no arquivo RouteConfig.cs e inicializada no arquivo Global.asax.
Por padrão, quando criamos um projeto ASP.NET MVC no Visual Studio, uma rota com o formato{controller}/{action}/{id} é adicionada na tabela de rotas.Exemplo: http://www.s2b.com.br/Produto/Edit/1
![Page 169: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/169.jpg)
ActionResult
Quando uma ação termina, o método correspondente deve devolver um ActionResult. O valor devolvido indica para o ASP.NET MVC o que deve ser executado depois da ação. Veja abaixo uma lista com alguns tipos específicos de ActionResult que podem ser utilizados.
![Page 170: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/170.jpg)
ActionResult
Considerando uma aplicação ASP.NET MVC 4 em C# e Razor, o método View(), ao ser cha- mado sem parâmetros, executará o seguinte processo para determinar qual arquivo deve ser utilizado para construir a página de resposta.
1. Se o arquivo Views\Teste\Acao.cshtml existir, ele será utilizado.2. Caso contrário, se o arquivo Views\Shared\Acao.cshtml existir,
ele será utilizado.3. Se nenhum desses arquivos existir, uma página de erro será
devolvida.
![Page 171: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/171.jpg)
ActionResult
Por outro lado, podemos especificar o nome do arquivo que define a página de resposta. Veja o exemplo abaixo.
Além disso, podemos passar um objeto para a camada de apresentação. Esse objeto será utilizado nas páginas fortemente tipadas
return View(“NomeDaView”);
return View(Produto);
![Page 172: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/172.jpg)
ActionResult
Também é possível especificar o nome do arquivo que define a página de resposta e o objeto que deve ser transmitido para a camada de apresentação ao mesmo tempo.
return View(“NomeDaView”, produto);
![Page 173: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/173.jpg)
PartialViewResult
Devolve uma página parcial da camada de apresentação. Exemplos:
O método PartialView() utiliza a mesma abordagem do método View() para determinar o arquivo que deve ser utilizado para construir a página parcial de resposta.
return PartialView();
return PartialView(“NomeDaPartialView”, produto);
![Page 174: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/174.jpg)
ActionResult (Outros recursos)
RedirectResult: Redireciona o navegador para uma URL específica. Exemplo:
RedirectToAction: Redireciona para outra ação da camada de controle. Exemplo:
return Redirect(“http://www.s2bminas.com.br”);
return RedirectToAction(“OutraAction”, “OutroController”);
ContentResult: Devolve texto. Exemplo
return Content(“Texto”, “text\plain“);
![Page 175: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/175.jpg)
ActionResult (Outros recursos)
JsonResult: Devolve um objeto no formato JSON. Exemplo
return Json(produto);
JavaScript: Devolve um código JavaScript. Exemplo
return JavaScript(“\$(‘\#divResultText’).html(‘JavaScript Passed’);”);
FileResult: Devolve dados binários. Exemploreturn File(@”c:\relatorio.pdf”, “application\pdf”);
EmptyResult: Devolve resposta vazia. Exemploreturn EmptyResult();
![Page 176: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/176.jpg)
Parâmetros
Os parâmetros enviados pelos usuários através de formulários HTML podem ser recuperados por meio da propriedade Request.string nome = Request[“Nome”];
Esses parâmetros também podem ser recuperados através dos parâmetros da ação responsável pelo processamento da requisição HTTP realizada. Para isso, basta definir um parâmetro C# para cada parâmetro HTTP com o mesmo nome. Veja o exemplo abaixo:Nome : <input type="text" name=“Nome"/> Descrição: <input type="text" name=“Descricao"/> Preço: <input type="text" name=“Preco"/>
![Page 177: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/177.jpg)
Parâmetros
No código anterior, criamos um formulário HTML com os parâmetros nome, descrição e preço. Esses parâmetros serão recuperados na ação Salva definida no código abaixo.[ HttpPost ]public ActionResult Salva(string nome, string descricao, string preco){
Produto produto = new Produto{Nome = nome, Descricao = Descricao, Preco = Preco}; db.Produtos.Add(produto);return View();
}
![Page 178: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/178.jpg)
Parâmetros
O ASP.NET MVC também é capaz de montar objetos com os valores dos parâmetros HTTP envi- ados pelo usuário e passá-los como argumento para as ações dos controladores.[ HttpPost ]public ActionResult Salva(Produto produto){
db.Produtos.Add(produto);return View();
}
![Page 179: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/179.jpg)
Exercícios
Utilize RedirectToAction Passe alguns parâmetros via Resques[] e via Objetos para a
Controller
![Page 180: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/180.jpg)
TempData
Ao efetuar um redirecionamento, uma nova requisição é realizada pelo navegador. Nesta nova requisição, não temos mais acesso aos dados e objetos da requisição anterior ao redirecionamento. Caso haja a necessidade de preservar dados ao longo do redirecionamento, podemos utilizar a propriedade TempData.
![Page 181: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/181.jpg)
TempData (Continuação)
Por exemplo, ao cadastrar uma produto, podemos efetuar um redirecionamento para a tela de listagem de produtos. Na propriedade TempData, podemos acrescentar uma mensagem indicando o eventual sucesso da operação. Veja o exemplo abaixo.
[ HttpPost ]public ActionResult Salva(Produto produto){
db.Produtos.Add(produto);db.SaveChanges();TempData[“Mensagem”] = “Produtos cadastrados com sucesso!”;return RedirectToAction(“Index”);
}
![Page 182: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/182.jpg)
TempData (camada de apresentação)
Na camada de apresentação, podemos recuperar os dados armazenados na propriedade TempData.Veja o código a seguir:
@if (TempData["Mensagem"] != null ){
<p>@TempData["Mensagem"]</p>}
![Page 183: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/183.jpg)
Exercícios
Repasse uma mensagem da camada de Controle para a de Apresentação usando o TempData;
![Page 184: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/184.jpg)
Rotas
O nome do controlador e o nome da ação desejados fazem parte da url. Exemplo: http://localhost<PORTA_APP>/Produto/Index
O formato dessas urls é definido por rotas criadas no arquivo RouteConfig.cs e carregadas no arquivo Global.asax.
RouteConfig.cs
![Page 185: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/185.jpg)
Rotas
O primeiro argumento do método MapRoute é o nome da rota, o segundo é a expressão que define o formato da rota e o terceiro é o conjunto de valores padrão dos parâmetros da rota.
URL Mapeamento da URL
/ controller = "Home", action = "Index"
/Produto controller = “Produto", action = "Index"
/Produto/Adiciona controller = “Produto", action = "Adiciona"
/Produto/Remove/1 controller = “Produto", action = "Remove", id = 1
![Page 186: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/186.jpg)
Adicionando uma rota
Para acrescentar uma rota, podemos utilizar o método MapRoute(). Suponha que a listagem de produtos deva ser acessada através da urlhttp://localhost:<PORTA_APP>/Catalogo. Nesse caso, podemos adicionar uma rota no arquivo RoutesConfig.cs, como mostrado abaixo.
routes.MapRoute ( name : "Nova Rota", url : "Catalogo",defaults : new{controller = “Produto", action = "Index" }
);
Importante: As rotas são processadas na ordem em que foram inseridas. Portanto, é importante definir as rotas mais específicas antes das rotas mais genéricas.
![Page 187: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/187.jpg)
Adicionando Parâmetros a uma rota
Por padrão, os parâmetros adicionados a uma rota são obrigatórios. Dessa forma, a listagem de categorias só poderá ser acessada se o valor do parâmetro maximo for definido na url da requisição. Por exemplo, http://localhost:<PORTA_APP>/Categoria/20. Se uma requisição for realizada para a url http://localhost:<PORTA_APP>/Categoria, um erro ocorrerá. routes.MapRoute (
name : "Nova Rota", url : "Categoria/{maximo}",defaults : new{controller = “Categoria", action = "Index" }
);
![Page 188: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/188.jpg)
Adiconando parãmetros
Para mudar esse comportamento, podemos tornar o parâmetro máximo opcional. Veja exemplo abaixo:routes.MapRoute (
name : "Nova Rota", url : "Categoria/{maximo}",defaults : new{controller = “Categoria", action = "Index" ,maximo = UrlParameter.Optional }
);
Os parâmetros das rotas podem ser recuperados nas ações. Public ActionResult Index(int? maximo){
// Implentação}
![Page 189: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/189.jpg)
Exerícios
Crie algumas Rotas novas
![Page 190: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/190.jpg)
Validação
Os usuários podem cometer erros ao preencher um formulário. Por exemplo, esquecer de preencher um campo que é obrigatório. Os parâmetros enviados pelos usuários devem ser validados pela aplicação com o intuito de não permitir o armazenamento de informações erradas.
![Page 191: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/191.jpg)
Validação (Camada de Controle)
O primeiro passo para implementar a validação dos parâmetros enviados através de formulários HTML é definir a lógica de validação na camada de controle.O segundo passo é definir mensagens informativas para enviar aos usuários. O ASP.NET MVC possui um objeto especializado no armazenamento de mensagens de erros de validação. Esse objeto pode ser acessado através da propriedade ModelState.If (produto.Nome == null || produto.Nome.Trim().Length == 0){
ModelState.AddModelError(“Nome”, “O campo Nome é obrigatório”);}
Validação na camada de Controle
![Page 192: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/192.jpg)
Validação (Camada de Controle)
As mensagens são armazenadas no ModelState através do método AddModelError(). Esse método permite que as mensagens sejam agrupadas logicamente, pois ele possui dois parâmetros: o primeiro é o grupo da mensagem e o segundo e a mensagem propriamente.Se algum erro for encontrado, o fluxo de execução pode ser redirecionado para uma página que mostre as mensagens informativas aos usuários.O ModelState possui uma propriedade que indica se erros foram adicionados ou não. Essa propriedade chama-se IsValid.
![Page 193: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/193.jpg)
Validação (Camada de Controle)
Veja o exemplo abaixo:[HttpPost]public ActionResult Salva(Produto produto){
if (produto.Nome == null || produto.Nome.Trim().Length == 0){Model State.AddModelError("Nome", "O campo Nome é obrigatório.");}if (ModelState.IsValid ) {
...}else {return View("Cadastra");}
}
![Page 194: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/194.jpg)
Validação (Camada View)
As mensagens de erros de validação podem ser acrescentadas em uma página através do método ValidationSummary() da propriedade Html. É importante salientar que esse método adiciona todas as mensagens de erro.@model LojaVirtual.Models.Produto@{
ViewBag.Title = "Cadastro de Produto"; }
< h2 >Cadastro de Produto</ h2 > @using (Html.BeginForm()) {
@Html.ValidationSummary()
< br/>…
![Page 195: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/195.jpg)
Validação (Camada View)
Podemos utilizar o método ValidationMessageFor() para mostrar somente as mensagens de erro de validação de um determinado grupo.Para não mostrar erros dos grupos com o ValidationSummary(), devemos passar como parâmetro o valor true. Nesse caso, apenas os erros que não estão associados a um grupo específico serão apresentados pelo ValidationSummary().
![Page 196: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/196.jpg)
Validação (Camada View)Exemplo de Exibição dos erros que não estão associados ao grupo.
@model LojaVirtual.Models.Produto@{
ViewBag.Title = "Cadastro de Produto"; }
< h2 >Cadastro de Produto</ h2 > @using (Html.BeginForm()) {
@Html.ValidationSummary(true) <br/>
@Html.LabelFor(model => model.Nome)@Html.EditorFor(model => model.Nome)@Html.ValidationMessageFor(model => model.Nome)
…
![Page 197: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/197.jpg)
Validação (Anotações)
As lógicas de validação também podem ser definidas através de anotações adicionadas nas classes de modelo. Dessa forma, essas lógicas não estariam mais nos controladores, o que conceitualmente é o ideal, pois nos controladores só deveria existir lógica para controlar o fluxo da execução.
![Page 198: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/198.jpg)
Validação (Anotações)
Required: Uma das validações mais comuns é a de campo obrigatório para propriedades do tipo string. As mensagens padrão podem ser alteradas através do atributo
ErrorMessage.
…[Required(ErrorMessage=“O campo Nome é obrigatório!”)]Public string Nome{get; set;}…
![Page 199: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/199.jpg)
Outros validadores
StringLength: Tamanho máximo que uma string deve permitir.[StringLength(30)][StringLength(100, MinimumLength = 3)]
RegularExpression: Permite informar uma expressão regular para validar o campo.[RegularExpression("^[0-9]{8}$")]
Range: Permite informar um range de valores para o campo.[Range(0.01, 100.00,
ErrorMessage = “O preço deve ser entre 0,01 and 100,00")]
![Page 200: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/200.jpg)
Exercícios
![Page 201: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/201.jpg)
Sessões
Considere a aplicação de uma loja virtual. Nessa aplicação, os clientes selecionam os produtos desejados e os adiciona no seu carrinho de compra. Cada cliente deve ter o seu próprio carrinho para que os seus produtos não se misturem com os produtos selecionados por outros clientes. A aplicação deve armazenar o carrinho de um cliente até que a compra seja finalizada ou até ela ter certeza que o cliente não precisa mais do carrinho.Para resolver esse problema, podemos utilizar o conceito de Sessão. Para cada navegador conectado, o servidor manterá uma sessão aberta.
![Page 202: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/202.jpg)
Sessões
Para armazenar informações, você deve adicionar uma chave e um valor na propriedade Session. Considere um objeto da classe Usuario que agrupa as informações sobre um determinado usuário. O código a seguir é um exemplo de como podemos guardar esse objeto na sessão após a realização da autenticação do usuário.Public class LoginController : Controller{
public ActionResult Login(Cliente cliente) {Session[“Cliente”] = cliente…
}}
![Page 203: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/203.jpg)
Sessões
Você pode adicionar qualquer tipo de valor na sessão. De forma análoga, para resgatar as infor- mações armazenadas, basta acessar a chave correspondente da propriedade Session. Veja o exemplo a seguir:Cliente cliente = (Cliente)Session[“Cliente”];String saudacao = “Bem vindo” + cliente.Nome;
Para aliminar todas as chaves do dicionário, utilize o RemoveAll(). E para eliminar utilize o Abandon().Session.RemoveAll();
Session.Abandon();
![Page 204: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/204.jpg)
Session Mode
O ASP.NET MVC disponibiliza quatro modos de sessão (Session Modes):InProc: [Padrão] Armazena a sessão na memória do
servidor. StateServer: São armazenadas em um servidor diferente.SQLServer: São armazenadas no Banco de Dados SQL
Server.Custom: O armazenamento pode ser personalizado.
<sessionState mode=“InProc” timeout=“30”/>Web.Config
![Page 205: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/205.jpg)
Exercícios1) Armazena uma sessão na Controladora e recupere na View.
![Page 206: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/206.jpg)
Filtros
Muitas vezes, queremos restringir o acesso à determinadas áreas de uma aplicação, seja por questões de segurança ou por organização. Em nossa aplicação poderíamos, por exemplo, definir que para poder adicionar, alterar e remover editoras, o usuário deve estar logado no sistema. Caso contrário, o usuário apenas poderá listar as editoras.
![Page 207: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/207.jpg)
Filtros
Exemplo, o usuário tente adicionar uma editora através do formulário de cadastro, a ação Cadastra verificará se o usuário já está logado.
.public ActionResult Cadastro(){
if (Session[“Cliente”] != null) {return base.View();
}else {
return base.RedirectToAction(“Index”), “Login”)}
}Web.Config
![Page 208: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/208.jpg)
Tipos de Filtros
O ASP.NET MVC possui 4 (quatro) tipos de filtros:
Tipo de Filtro Interface Implementação Padrão
Autorização IAuthorizationFilter AuthorizeAttribute
Ação IActionFilter ActionFilterAttribute
Resultado IResultFilter ActionFilterAttribute
Exceção IExceptionFilter HandleErrorAttribute
![Page 209: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/209.jpg)
Filtros
Autorização: Filtro utilizado para restringir o acesso a ação do controlador a usuários autenticados e autorizados. Caso o usuário não tenha permissão, o filtro retorna a resposta 401 HTTP Unauthorized. Se o filtro for adicionado ao controlador, todas as ações terão o acesso restrito.
Importante:Este filtro é executado antes dos outros filtros
![Page 210: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/210.jpg)
Outros Filtros
Ação: Este filtro é executado antes ou depois da ação ser executada. Este filtro é chamado depois do filtro de autorização e antes do filtro de resultado.
Resultado: O filtro de resultado é executado antes ou depois do resultado da ação ser processado. Este filtro permite alterarmos a maneira como o resultado da ação é gerado.
Exceção: Este filtro é utilizado para tratar as exceções. Este filtro é executado quando ocorre uma exceção no método ou nos filtros da ação.
![Page 211: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/211.jpg)
Filtro de Autorização
Os filtros de autorização implementam a interface IAuthorizationFilter.
public interface Iauthorization Filter{
void OnAuthorization(AuthorizationContext filterContext);}
IAuthorizationFilter.cs
O método OnAuthorization é executado pelo ASP .NET MVC para realizar a autorização. A classe AuthorizationContext é derivada de ControllerContext, que permite o acesso aos dados do controlador, da rota e da requisição.
![Page 212: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/212.jpg)
Filtros de Autorização
O ASP .NET MVC contém uma implementação padrão da IAuthorizationFilter que é a classe AuthorizeAttribute. A classe AuthorizeAttribute define a anotação Authorize, que pode ser adicionada a ação ou ao controlador para restringirmos o acesso a usuários autenticados e autorizados.Caso um usuário não autorizado acesse uma ação ou um controlador marcado com a anotação Authorize, o MVC Framework retornará a resposta 401 HTTP status. Se a aplicação estiver configurada para utilizar ASP.NET Forms Authentication, o usuário será redirecionado para uma página de login.
![Page 213: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/213.jpg)
Filtros de Autorização (Exemplo)
Para o nosso primeiro exemplo, podemos utilizar o filtro de autorização, onde exigimos que o usuário esteja logado (autenticado) para acessar determinadas áreas da aplicação. Para isso, precisamos adicionar o seguinte código no nosso método de login:…
FormsAuthentication.SeAuthCookie(usuario.Username, false);…
AutenticadorController.cs
![Page 214: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/214.jpg)
Filtros de Autorização (Exemplo)
Isto adiciona um novo cookie utilizado para a autenticação do usuário. Este novo cookie é in- dependente do cookie utilizado para armazenar informações da sessão. O primeiro parâmetro é referente ao nome do usuário (ou algo que o identifique). O segundo parâmetro é um booleano relativo ao tipo do cookie, se é permanente ou não. Caso seja true, ele sempre irá considerar que o usuário está autenticado após a primeira autenticação. Para eliminar o cookie de autenticação, devemos adicionar o
seguinte código na acão de logout:
FormsAuthentication.SignOut();AutenticadorController.cs
![Page 215: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/215.jpg)
Filtros de Autorização (Exemplo)
As ações que devem utilizar o filtro de autorização devem ser anotadas com Authorize. Veja o exemplo na EditoraController.cs:[Authorize]public ActionResult Cadastra(){
return base.View();}
Para aplicar o filtro a todas as ações de um controlador, podemos adicionar a anotação Authorize na classe.[Authorize]public class EditoraController() : Controllher…
![Page 216: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/216.jpg)
Filtros de Autorização
Desse modo, todas as ações presentes no controlador da Editora exigem que o usuário esteja autenticado.Quando o filtro de autorização “barra” um usuário de acessar uma página, podemos redirecionálo para a página de login. Devemos incluir o seguinte código dentro da tag <system.web> do arquivo Web.Config.<authenticationmode="Forms">
<formsloginUrl="~/Autenticador/Login“ timeout="2880"/></authentication>
Web.Config
![Page 217: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/217.jpg)
Filtros de Autorização
Através da propriedade User, podemos obter o usuário associado a requisição atual. As informações do usuário podem ser obtidas através da propriedade Identity. Por exemplo, podemos verificar se o usuário associado à requisição atual está autenticado, basta utilizar a propriedade IsAuthenticated da propriedade Identity:
if (User.Identity.IsAuthenticated){
...}
Verificando a autenticação do usuário
![Page 218: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/218.jpg)
Filtros de autorizaçãoPara obter o nome do usuário autenticado, podemos utilizar a propriedade Name da propriedade. Identity:
A propriedade Name retorna o nome do usuário que passamos como parâmetro para o método SetAuthCookie na autenticação.
string nome = User.Identity.Name;
![Page 219: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/219.jpg)
Exercícios
![Page 220: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/220.jpg)
Filtros de Ação
Os filtros de ação são executados antes ou depois de uma ação. Todos os filtros de ação de- vem implementar a interface IActionFilter. A interface IActionFilter contém dois métodos OnActionExecuted e OnActionExecuting.
public interface IActionFilter{
void OnActionExecuted(ActionExecutedContext filterContext);void OnActionExecuting(ActionExecutingContext filterContext);
}IActionFilter.cs
O método OnActionExecuting é chamado antes da ação ser executada e o método OnActionExecuted é chamado depois da ação ser executada.
![Page 221: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/221.jpg)
Filtro de Resultados
O filtro de resultado é executado antes ou depois do resultado da ação ser gerado. O resultado da ação pode ser um JSON, uma página HTML ou qualquer outro resultado que derive da classe ActionResult. Para definir um filtro de resultado, devemos implementar a interface IResultFilter que contém dois métodos OnResultExecuted e OnResultExecuting.public interface IResultFilter{
void OnResultExecuted(ResultExecutedContext filterContext);void OnResultExecuting(ResultExecutingContext filterContext);
}
![Page 222: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/222.jpg)
Filtro de Resultado
Para aplicar o filtro, basta adicionar a anotação ElapsedTime no controlador ou na ação.
...[ ElapsedTime ]public ActionResult Index () {
return View(db.Produtos.ToList()); }
...ProdutoController.cs
![Page 223: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/223.jpg)
Filtro de Resultado
Ao acessar o seguinte endereço http://localhost:<PORTA_APP>/Produtos, podemos visualizar a duração entre a execução da ação e a geração do resultado
![Page 224: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/224.jpg)
Filtros de Exceção
Os filtros de exceção são executados quando ocorrem exceções nas ações ou nos filtros. Os filtros de exceção devem implementar a interface IExceptionFilter.
public interface IExceptionFilter{
void OnException(ExceptionContext filterContext );}
IExceptionFilter.cs
![Page 225: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/225.jpg)
Filtros de Exceção
O ASP .NET MVC contém a classe HandleErrorAttribute que é uma implementação padrão de IExceptionFilter. O filtro HandleErrorAttributeretorna a página Error localizada na pasta Views/Shared quando ocorre uma exceção. Através da HandleErrorAttribute podemos alterar a página de erro retornada de acordo com o tipo de exceção.[ HandleError(ExceptionType = typeof(InvalidOperationException ),View ="OperacaoInvalida")] [HandleError]public ActionResult Index (){
return View(db.Produtos.ToList ());}
IExceptionFilter.cs
![Page 226: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/226.jpg)
Filtros de Exceções
No exemplo anterior, a primeira anotação filtrará os erros do tipoInvalidOperationException e retornará a página OperacaoInvalidada pasta Views/Shared. A segunda anotação filtrará todas as exceções e retornará a página padrão Error da pasta Views/Shared. É necessário habilitar o ele- mento customErrors no arquivoWeb.config para o filtro HandleErrorAttribute funcionar.
![Page 227: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/227.jpg)
Exercícios
![Page 228: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/228.jpg)
Tratamento de Erros
Inevitavelmente, 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 informativas com o intuito de fazer o próprio usuário corrigir os valores preenchidos incorretamente.
![Page 229: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/229.jpg)
Tratamento de Erros (Try-Catch)
Os erros de aplicação podem ser identificados através do comando try-catch, que pode ser colocados nos métodos que definem as ações dos controladores. Ao identificar a ocorrência de um erro, os controladores podem devolver uma página web com alguma mensagem para o usuário.
![Page 230: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/230.jpg)
Tratamento de Erros (Try-Catch)
Exemplo:
[ HttpPost ]public ActionResult Salva(Produto produto){
Try {db.Produtos.Add(produto);
}Catch {
return View("Error");}
return RedirectToAction("Index");}
![Page 231: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/231.jpg)
Tratamento de errosExemplo de página de erros
…<h2>Servidor com problemas</h2><p>Houve um problema em nosso servidor .<br/>Por favor tente novamente dentro de alguns instantes .</ p>...
Error.cshtml
Importante: Uma página de erro padrão dentro da pasta Views\Shared
![Page 232: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/232.jpg)
Custom Errors
Utilizar o comando try-catch nos controladores para lidar com os erros de aplicação não é uma boa alternativa, pois o código do controlador fica mais complexo. Além disso, haveria replicação de código nos controladores, pois provavelmente a página de erro seria padronizada.Para lidar com os erros de aplicação de uma maneira mais prática e fácil de manter, podemos configurar o ASP.NET MVC para utilizar páginas de erro padrão. O primeiro passo é alterar o arquivo de configuração Web.config, acrescentando a tag<customErrors> dentro da tag <system.web>.
![Page 233: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/233.jpg)
Custom Errors
O atributo mode da tag <customErrors> pode assumir três valores:
On: A página de erro padrão será enviada para usuários locais e remotos.
Off: A página de erro detalhada será enviada para usuários locais e remotos.
RemoteOnly: A página de erro detalhada será enviada para osusuários locais e a padrão para os remotos.
![Page 234: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/234.jpg)
Http Errors
Um dos erros mais conhecidos do HTTP é o 404, que ocorre quando o navegador faz uma re- quisição para uma url que não existe. Basicamente, esse erro é gerado por falhas dos usuários ao tentarem digitar diretamente uma url na barra de endereço dos navegadores ou por links ou botões “quebrados” nas páginas da aplicação.Quando o erro 404 ocorre, o ASP.NET MVC utiliza a página padrão para erros de aplicação con- figurada no Web.configatravés da tag <customErrors>. >. Porém, esse erro não deve ser considerado um erro de aplicação, pois ele pode ser gerado por falhas do usuário.
![Page 235: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/235.jpg)
Http Errors…<h2>Arquivo ou caminho não encontrado!</h2><p>O caminho informado ou arquivo não foi encontrado.<br/>Verifique se a URL informada está correta!</ p>...
NotFound.cshtml
<customErrorsmode=" On"><errorstatusCode="404" redirect="~/ErrorPage/NotFound"/></custom Errors>
Web.Config
![Page 236: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/236.jpg)
De acordo com o código anterior, devemos definir um controlador chamado ErrorPage com uma ação chamadaNotFound. Essa ação será acionada toda vez que o erro404 do HTTP ocorrer.public class ErrorPageController: Controller{
public ActionResult NotFound(){
return View ();}
}ErrrorPageController.cs
![Page 237: Treinamento Asp.net MVC (S2B) PUC Minas](https://reader033.vdocuments.pub/reader033/viewer/2022042515/58ce7dd31a28ab210a8b4e4f/html5/thumbnails/237.jpg)
© 2016 Microsoft Corporation. All rights reserved.