(MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

244

Transcript of (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 1/244

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 2/244

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 3/244

Desenvolvimento Web com ASP.NET MVC 4

30 de agosto de 2013

Sumário i

Sobre a K19 1

Seguro Treinamento 2

Termo de Uso 3

Cursos 4

1 Banco deDados 11.1 Sistemas Gerenciadores de Banco de Dados . . . . . . . . . . . . . . . . . . . . . . . . . . 11.2 SQL Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21.3 Bases de Dados (Databases ) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21.4 Tabelas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41.5 CRUD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61.6 Chaves Primária e Estrangeira . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91.7 Exercícios de Fixação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

2 ADO.NET 232.1 Driver . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242.2 ODBC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252.3 ODBC Manager . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252.4 Criando uma conexão . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262.5 Inserindo registros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262.6 Exercícios de Fixação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272.7 Exercícios Complementares . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282.8 SQL Injection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282.9 Exercícios de Fixação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292.10 Exercícios Complementares . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302.11 Listando registros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302.12 Exercícios de Fixação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312.13 Exercícios Complementares . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 322.14 Connection Factory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32

www.facebook.com/k19treinamentos i

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 4/244

SUMÁRIO ii

2.15 Exercícios de Fixação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332.16 Exercícios Complementares . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 352.17 Desaos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35

3 Entity Framework 373.1 Múltiplas sintaxes da linguagem SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373.2 Orientação a Objetos VS Modelo Relacional . . . . . . . . . . . . . . . . . . . . . . . . . . 373.3 Ferramentas ORM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 383.4 Instalando o Entity Framework . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 393.5 Conguração . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 403.6 Convenções de Mapeamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 413.7 Exercícios de Fixação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 473.8 Data Annotations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 503.9 Exercícios de Fixação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 553.10 Gerenciamento de entidades . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 553.11 Exercícios de Fixação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 573.12 Repositórios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59

4 Code First Migrations 614.1 Code First Migrations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 614.2 Exercícios de Fixação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 674.3 Acrescentando uma nova entidade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 714.4 Exercícios de Fixação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 734.5 Operações do Code First Migrations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 744.6 Exercícios de Fixação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 754.7 Migração para uma versão especíca . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 774.8 Gerando Script SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78

5 Visão Geral do ASP.NET MVC 795.1 Necessidades de uma aplicação web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 795.2 ASP.NET MVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 805.3 MVC e Front Controller . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 805.4 Visual Studio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 815.5 Exemplo de uma Aplicação Web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 825.6 Exercícios de Fixação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 835.7 Integração com Entity Framework . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 885.8 Scaffold . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 885.9 Exercícios de Fixação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89

6 Camada de Apresentação 936.1 Razor e ASPX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 936.2 Exercícios de Fixação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 956.3 Exercícios Complementares . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 966.4 ViewBag e Strogly Typed Views . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 976.5 Exercícios de Fixação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 996.6 HTML Helpers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1026.7 Exercícios de Fixação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1116.8 Layouts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1156.9 Exercícios de Fixação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1186.10 Partial views . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124

ii www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 5/244

iii SUMÁRIO

6.11 Exercícios de Fixação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126

7 Camada de Controle 1297.1 Actions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1297.2 ActionResult . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1307.3 Parâmetros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1317.4 Exercícios de Fixação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1327.5 TempData . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1357.6 Exercícios de Fixação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1367.7 Rotas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1377.8 Exercícios de Fixação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139

8 Validação 1438.1 Controller . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1438.2 View . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1448.3 Exercícios de Fixação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1458.4 Anotações . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1488.5 Validação no lado do Cliente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1498.6 Exercícios de Fixação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150

9 Sessão 1539.1 Identicando os navegadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1539.2 Sessões no ASP.NET MVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1539.3 Session Mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1549.4 Exercícios de Fixação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155

10 Filtros 16110.1 Tipos de Filtros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16110.2 Filtro de Autorização . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16210.3 Exercícios de Fixação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16410.4 Filtro de Ação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17010.5 Exercícios de Fixação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17110.6 Filtro de Resultado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17410.7 Exercícios de Fixação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17610.8 Filtro de Exceção . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17610.9 Exercícios de Fixação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177

11 Tratamento de Erros 18111.1 Try-Catch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18211.2 Custom Errors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18311.3 Http Errors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18311.4 Exercícios de Fixação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185

A ASP.NET Web API 189 A.1 REST . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189 A.2 Resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190 A.3 URIs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190 A.4 Operações . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190 A.5 Media Type . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192 A.6 Exercícios de Fixação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192

www.facebook.com/k19treinamentos iii

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 6/244

SUMÁRIO iv

B Projeto 197B.1 Modelo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197B.2 Exercícios de Fixação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197B.3 Persistência - Mapeamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198B.4 Exercícios de Fixação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198B.5 Persistência - Conguração . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199B.6 Exercícios de Fixação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199B.7 Persistência - Repositórios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199B.8 Exercícios de Fixação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199B.9 Exercícios de Fixação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201B.10 Apresentação - Template . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202B.11 Exercícios de Fixação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202B.12 Cadastrando e Listando Seleções . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205B.13 Exercícios de Fixação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205B.14 Removendo Seleções . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208B.15 Exercícios de Fixação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208B.16 Cadastrando, Listando e Removendo Jogadores . . . . . . . . . . . . . . . . . . . . . . . 210B.17 Exercícios de Fixação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210B.18 Removendo Jogadores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214B.19 Exercícios de Fixação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214B.20 Membership e Autorização . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216B.21 Exercícios de Fixação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216B.22 Exercícios de Fixação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224B.23 Exercícios de Fixação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225B.24 Controle de Erro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226B.25 Exercícios de Fixação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226B.26 Enviando email . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227B.27 Exercícios de Fixação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227

C Respostas 231

iv www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 7/244

1 SUMÁRIO

Sobre a K19

A K19 é uma empresa especializada na capacitação de desenvolvedores de software. Sua equipeé composta por prossionais formados em Ciência da Computação pela Universidade de São Paulo

(USP) e que possuem vasta experiência em treinamento de prossionais para área de TI.O principal objetivo da K19é oferecer treinamentos de máximaqualidadee relacionados às prin-

cipais tecnologias utilizadas pelas empresas. Através desses treinamentos, seus alunos se tornamcapacitados para atuar no mercado de trabalho.

Visando a máxima qualidade, a K19 mantém as suas apostilas em constante renovação e melho-ria, oferece instalações físicas apropriadas para o ensino e seus instrutores estão sempre atualizadosdidática e tecnicamente.

www.facebook.com/k19treinamentos 1

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 8/244

SUMÁRIO 2

Seguro Treinamento

Na K19 o aluno faz o curso quantas vezes quiser!

Comprometida com o aprendizado e com a satisfação dos seus alunos, a K19 é a única que pos-sui o Seguro Treinamento. Ao contratar um curso, o aluno poderá refazê-lo quantas vezes desejarmediante a disponibilidade de vagas e pagamento da franquia do Seguro Treinamento.

As vagas não preenchidas até um dia antes do início de uma turma da K19 serão destinadas aoalunos que desejam utilizar o Seguro Treinamento. O valor da franquia para utilizar o Seguro Treina-mento é 10% do valor total do curso.

2 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 9/244

3 SUMÁRIO

Termo de Uso

Termo de Uso

Todoo conteúdo desta apostila é propriedade da K19Treinamentos. A apostila pode ser utilizadalivremente para estudo pessoal . Além disso, este material didático pode ser utilizado como materialde apoio em cursos de ensino superior desde que a instituição correspondente sejareconhecidapeloMEC (Ministério da Educação) e que a K19sejacitadaexplicitamente como proprietária do material.

É proibida qualquer utilização desse material que não se enquadre nas condições acima semo prévio consentimento formal, por escrito, da K19 Treinamentos. O uso indevido está sujeito àsmedidas legais cabíveis.

www.facebook.com/k19treinamentos 3

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 10/244

SUMÁRIO 4

K01- Lógica de Programação

K11 - Orientação a Objetos em Java

K12 - Desenvolvimento Web com JSF2 e JPA2

K21 - Persistência com JPA2 e Hibernate

K22 - Desenvolvimento Web Avançado com JFS2, EJB3.1 e CDI

K23 - Integração de Sistemas com Webservices, JMS e EJB

K31 - C# e Orientação a Objetos

K32 - Desenvolvimento Web com ASP.NET MVC

T R E I N A M E N T O S

TREINAMENTOST R E I N A M E N T O S Conheça os nossos cursos

www.k19.com.br/cursos

K02 - Desenvolvimento Web com HTML, CSS e JavaScript

K03 - SQL e Modelo Relacional

K41 - Desenvolvimento Mobile com Android

K51 - Design Patterns em Java

K52 - Desenvolvimento Web com Struts

4 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 11/244

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 12/244

B ANCO DE D ADOS 2

• MySQL Server

• PostgreSQL

SQL ServerNeste treinamento, utilizaremos o SQL Server Express, que é mantido pela Microsoft. O SQL ServerExpress pode ser obtido a partir do site:

http://www.microsoft.com/express/Database/ .

Microsoft SQL Server Management Studio Express

Para interagir com o SQL Server Express, utilizaremos um cliente com interface gráca chamadode Microsoft SQL Server Management Studio Express.

Bases de Dados ( Databases )Um sistema gerenciador de banco de dados é capaz de gerenciar informações de diversos sistemasao mesmo tempo. Por exemplo, as informações dos clientes de umbanco, alémdos produtos de umaloja virtual ou dos livros de uma livraria.

Suponha que os dados fossem mantidos sem nenhuma separação lógica. Implementar regrasde segurança especícas seria extremamente complexo. Tais regras criam restrições quanto ao con-teúdo que pode ser acessado por cada usuário. Por exemplo, determinado usuário poderia ter per-missão de acesso aos dados dos clientes do banco, mas não às informações dos produtos da lojavirtual, ou dos livros da livraria.

Para obter uma organização melhor, os dados são armazenados separadamente em um SGDB.Daí surge o conceito debase de dados (database). Uma base de dados é um agrupamento lógico dasinformações de um determinado domínio.

Criando uma base de dados no SQL Server Express

Para criar uma base de dados no SQL Server Express, utilizamos o comandoCREATEDATABASE.

2 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 13/244

3 B ANCO DE D ADOS

www.facebook.com/k19treinamentos 3

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 14/244

B ANCO DE D ADOS 4

Repare que além da base de dados livraria há outras bases. Essas bases foram criadas automati-camente pelo próprio SQL Server Express para teste ou para guardar algumas congurações.

Quando uma base de dados não é mais necessária, ela pode ser removida através do comandoDROP DATABASE.

TabelasUm servidor de banco de dados é dividido em bases de dados com o intuito de separar as informa-ções de domínios diferentes. Nessa mesma linha de raciocínio, podemos dividir os dados de umabase a m de agrupá-los segundo as suas correlações. Essa separação é feita através de tabelas . Porexemplo, no sistema de um banco, é interessante separar o saldo e o limite de uma conta, do nome eCPF de um cliente. Então, poderíamos criar uma tabela para os dados relacionados às contas e outrapara os dados relacionados aos clientes.

Clientenome idade cpf José 27 31875638735Maria 32 30045667856

Contanumero saldo limite1 1000 5002 2000 700

Tabela 1.1: Tabelas para armazenar os dados relacionados aos clientes e às contas

Uma tabela é formada por registros (linhas) e os registros são formados por campos (colunas).Por exemplo, considere uma tabela para armazenar as informações dos clientes de um banco. Cadaregistro dessa tabela armazena em seus campos os dados de um determinado cliente.

Criando tabelas no SQL Server Express

As tabelas no SQL Server Express são criadas através do comandoCREATE TABLE. Na criação deuma tabela é necessário denir quais são os nomes e os tipos das colunas.

4 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 15/244

5 B ANCO DE D ADOS

www.facebook.com/k19treinamentos 5

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 16/244

B ANCO DE D ADOS 6

No SQL Server os nomes das tabelas são precedidas pelo ID do usuário que possui a tabela. Nocaso do usuário sa , o ID é dbo. Portanto o nome da tabela Livros ca dbo.Livros .

Se uma tabela não for mais desejada ela pode ser removida através do comando DROPTABLE.

CRUD As operações básicas para manipular os dados persistidos são: inserir, ler, alterar e remover.

Essas operações são realizadas através de umalinguagem de consulta denominada SQL(Structu-red Query Language ). Essa linguagemoferece quatro comandos básicos: INSERT, SELECT, UPDATE

6 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 17/244

7 B ANCO DE D ADOS

e DELETE. Esses comandos são utilizados para inserir, ler, alterar e remover registros, respectiva-mente.

www.facebook.com/k19treinamentos 7

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 18/244

B ANCO DE D ADOS 8

8 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 19/244

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 20/244

B ANCO DE D ADOS 10

consultar a tabela Livro para obter o nome da editora correspondente. Depois, com esse nome, deveconsultar a tabela Editora para obter as informações da editora.

Porém, há um problema nessa abordagem. A tabela Editora aceita duas editoras com o mesmonome. Dessa forma, eventualmente, não conseguiríamos descobrir os dados corretos da editora deum determinado livro. Para resolver esse problema,deveríamos criar umarestrição na tabelaEditoraque proíba a inserção de editoras com o mesmo nome.

Para resolver esse problema no SQL Server Express, poderíamos adicionar a propriedade UNI-QUE no campo nome da tabela Editora. Porém, ainda teríamos mais um problema. Na tabela Li-vro, poderíamos adicionar registros vinculados a editoras inexistentes, pois não há nenhuma relaçãoexplícita entre as tabelas. Para solucionar esses problemas, devemos utilizar o conceito de chaveprimária e chave estrangeira .

Toda tabela pode ter uma chave primária, que é um conjunto de um ou mais campos que de-

vem ser únicos para cada registro. Normalmente, um campo numérico é escolhido para ser a chaveprimária de uma tabela, pois as consultas podem ser realizadas com melhor desempenho.

Então, poderíamos adicionar um campo numérico na tabela Editora e torná-lo chave primária. Vamos chamar esse campo de id. Na tabela Livro, podemos adicionarum campo numérico chamadoeditora_id que deve ser utilizado para guardar o valor da chave primária da editora correspondenteao livro. Além disso, o campo editora_id deve estar explicitamente vinculado com o campo id databela Editora. Para estabelecer esse vínculo, o campo editora_id da tabela Livro deve ser uma chaveestrangeira associada à chave primária da tabela Editora.

Uma chave estrangeira é um conjunto de uma ou mais colunas de uma tabela que possuem va-lores iguais aos da chave primária de outra tabela.

Com a denição da chave estrangeira, um livro não pode ser inserido com o valor do campoeditora_id inválido. Caso tentássemos fazer isso, obteríamos uma mensagem de erro.

Exercícios de Fixação

1 Abra o Microsoft SQLServer Management Studio Express utilizando NOME_DA_MAQUINA SQLEXPRESS como Server Name,SQL Server Authentication como Authentication, sa como Logine sa como Password.

10 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 21/244

11 B ANCO DE D ADOS

2 Caso exista uma base de dados chamada Livraria , remova-a conforme a gura abaixo:

www.facebook.com/k19treinamentos 11

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 22/244

B ANCO DE D ADOS 12

3 Crie uma nova base de dados chamada livraria , conforme mostrado na gura abaixo. Você vaiutilizar esta base nos exercícios seguintes.

12 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 23/244

13 B ANCO DE D ADOS

4 Crie uma tabela chamada Editoras conforme as guras abaixo.

www.facebook.com/k19treinamentos 13

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 24/244

B ANCO DE D ADOS 14

Altere os campos para torná-los obrigatórios, NÃOpermitindo que eles quem em brancoNULL .

Além disso o campo Id deve ser uma chave primária.

14 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 25/244

15 B ANCO DE D ADOS

O campo Id dever ser incrementado automaticamente. Dena ele com a propriedade Identity segundo a gura abaixo:

5 Crie uma tabela chamada Livros conforme as guras abaixo:

www.facebook.com/k19treinamentos 15

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 26/244

B ANCO DE D ADOS 16

Lembrando de NÃO marcar a opção ALLOW NULL. Além disso o campo Id deve ser uma chaveprimária e automaticamente incrementada.

Você precisa tornar o campo EditoraId uma chave estrangeira. Clique com o botão direito sobrea coluna EditoraId e selecione a opção Relantioships... , conforme a gura abaixo:

16 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 27/244

17 B ANCO DE D ADOS

Devemos acrescentar o relacionamento entre livro e editora. Clique em Adde posteriormente nobotão à direita na linha Tables and Columns Specication .

Devemos informar qual é a chave primária que a coluna EditoraId da tabela Livros faz referência.

www.facebook.com/k19treinamentos 17

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 28/244

B ANCO DE D ADOS 18

Para isto, informe a tabela Editoras como Primary Key Table e indique a coluna Id como a chaveprimária referenciada. Selecione a coluna EditoraId como a coluna que irá fazer referência a chaveprimária da tabela Editoras.

6 Adicione alguns registros na tabela Editoras. Veja exemplos na gura abaixo:

Adicione alguns registros na tabela Livros. Veja exemplos na gura abaixo:

18 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 29/244

19 B ANCO DE D ADOS

7 Consulte os registros da tabela Editoras, e em seguida consulte a tabela Livros. Veja exemploslogo abaixo:

www.facebook.com/k19treinamentos 19

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 30/244

B ANCO DE D ADOS 20

8 Altere alguns dos registros da tabela Livros. Veja o exemplo abaixo:

9 Altere alguns dos registros da tabela Editoras. Veja o exemplo abaixo:

20 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 31/244

21 B ANCO DE D ADOS

10 Remova alguns registros da tabela Livros. Veja o exemplo abaixo:

11 Remova alguns registros da tabela Editoras. Preste atenção para não remover uma editora quetenha algum livro relacionado já adicionado no banco. Veja o exemplo abaixo:

www.facebook.com/k19treinamentos 21

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 32/244

B ANCO DE D ADOS 22

12 Faça uma consulta para buscar todos os livros de uma determinada editora. Veja um exemplona gura abaixo:

22 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 33/244

ADO.NET C A P

Í T U L O

2No capítulo anterior, aprendemos que utilizar bancos de dados é uma ótima alternativa para

armazenar os dados de uma aplicação. Entretanto, você deve ter percebido que as interfaces dispo-níveis para interagir com o SQL Server Express não podem ser utilizadas por qualquer pessoa. Parautilizá-las, é necessário conhecer a linguagem SQL e os conceitos do modelo relacional. Em geral, asinterfaces dos outros SGDBs exigem os mesmos conhecimentos.

Figura 2.1: Usuários comuns não possuem conhecimento sobre SQL ou sobre o modelo relacional

Para resolveresse problema,podemos desenvolver aplicações cominterfacesque nãoexijam co-nhecimentos técnicos de SQL ou do modelo relacional para serem utilizadas. Dessa forma, usuárioscomuns poderiam manipular as informações do banco de dados através dessas aplicações. Nessaabordagem, os usuários interagem com as aplicações e as aplicações interagem com os SGDBs.

Figura 2.2: Usuários comuns devem utilizar interfaces simples

www.facebook.com/k19treinamentos 23

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 34/244

ADO.NET 24

Driver As aplicações interagem com os SGDBs através de troca de mensagens. Os SGDBs denem o formato

das mensagens. Para não sobrecarregar o canal de comunicação entre as aplicações e os SGDBs, asmensagens trocadas devem ocupar o menor espaço possível. Geralmente, protocolos binários sãomais apropriados para reduzir o tamanho das mensagens e consequentemente diminuir a carga docanal de comunicação. Por isso, os SGDBs utilizam protocolos binários.

getTransactionbegin

commit

rollback

persistgetReference

nd

1011011100010010

Figura 2.3: Diminuindo o tamanho das mensagens para não sobrecarregar o meio de comunicação

Mensagens binárias são facilmente interpretadas por computadores. Por outro lado, são com-plexas para um ser humano compreender. Dessa forma, o trabalho dos desenvolvedores seria muitocomplexo, aumentando o custo para o desenvolvimento e manutenção das aplicações.

Figura 2.4: Mensagens binárias são altamente complexas para os seres humanos

Para resolver esse problema e facilitar o desenvolvimento das aplicações, as empresas proprietá-

24 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 35/244

25 ADO.NET

rias dosSGDBs,normalmente, desenvolvem e distribuemdrivers de conexão . Um driverde conexãoatua como um intermediário entre as aplicações e os SGDBs.

Os drivers de conexão são “tradutores” de comandos escritos em uma determinada linguagemde programação para comandos denidos de acordo com o protocolo de um SGDB. Utilizando umdriver de conexão, os desenvolvedores das aplicações não manipulam diretamente as mensagensbinárias trocadas entre as aplicações e os SGDBs.

Mais SobreEm alguns casos, o protocolo binário de um determinado SGDB é fechado. Consequen-temente, a única maneira de se comunicar com ele é através de um driver de conexão

oferecido pelo fabricante desse SGDB.

ODBCSuponha que os proprietários dos bancos de dados desenvolvessem os drivers de maneira total-mente independente. Consequentemente, cada driver teria sua própria interface, ou seja, seu pró-prio conjunto de instruções. Dessa maneira, o desenvolvedor da aplicação precisa conhecer as ins-truções de cada um dos drivers dos respectivos bancos que ele for utilizar.

Para facilitar o trabalho do desenvolvedor da aplicação, a Microsoft® deniu uma especicaçãochamada 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 especicação com o intuito de popularizá-lo.

Os drivers de conexão que respeitam a especicação ODBC, ou seja, possuem um conjunto decomandos padronizados, são chamados de drivers de conexão ODBC.

ODBC ManagerPara que drivers ODBC possam ser instalados em uma máquina e as aplicações consigam utilizá-losé necessário ter o ODBC Manager, que já vem instalado no Windows®.

O driver de conexão ODBC já está disponível para utilização, podemos consultar o ODBC Mana-ger do Windows®. O ODBC Manager pode ser executado através do item Ferramentas Administrati-vas do Painel de Controle.

www.facebook.com/k19treinamentos 25

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 36/244

ADO.NET 26

Criando uma conexãoCom o driver de conexão ODBC instalado na máquina já é possível criar uma conexão com o bancode dados correspondente. O que é necessário para estabelecer uma conexão com o banco de dados?

• Escolher o driver de conexão;

• Denir a localização do banco de dados;

• Informar o nome da base de dados;

• Ter um usuário e senha cadastrados no banco de dados.

Todas essas informações são denidas na chamada string de conexão .

1 string s t r in gD eCo nex ao = @"d r iv er={SQ L Server} ;2 server=MARCELO -PC\SQLEXPRESS; database=livrar ia;u id=sa;pwd= sa;" ;

Código C# 2.1: Denindo a string de conexão

Após a denição da string de conexão, podemos utilizar a classeSystem.Data.Odbc.OdbcConnec-tion do .NET Framework . Essa classe é responsável por criar conexões ODBC.

1 O d b cCo n n ec tio n co n ex ao = ne w OdbcConnection(s tr ingDeConexao) ;

Código C# 2.2: Criando uma conexão ODBC

Inserindo registrosEstabelecida a conexão com o banco de dados, já podemos executar comandos. Por exemplo, é pos-sível inserir registros nas tabelas. O primeiro passo para executar um comando é deni-lo em lin-guagem SQL de acordo com a sintaxe do SGDB utilizado.

26 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 37/244

27 ADO.NET

1 string tex to Do Co man d o = @"IN SERT IN TO Ed i to r as (N o me, Email )2 VA LUES ( ’A b ri l ’ , ’ ab r i l@emai l . co m’ ) ;" ;

Mais SobreO caractere “@” antes de um valor literal do tipo string indica que os caracteres dentroda string não devem ser processados como caracteres especiais.

Em seguida, devemos criar um objeto da classe System. Data.Odbc.OdbcCommand a partir docódigo sql e da conexão previamente criados. O comando não é executado quando os objetos dessaclasse são instanciados.

1 O d bc C om m an d c o ma n do = ne w OdbcCommand( tex toDoComando , conexao) ;

Código C# 2.4: Criando um comando ODBC

Por m, o comando pode ser executado através do método ExecuteNonQuery() . A conexão deveser aberta antes de executar o comando.

1 co n ex ao .O p en ( ) ;2 co man d o .Ex ecuteN o n Qu ery ( ) ;

Importante A mesma conexão pode ser reaproveitada para executar várias operações. Quando nãohouver mais operações a serem executadas, devemos nalizar a conexão ODBC através

do método Close() . Finalizar as conexões ODBC que não são mais necessárias é importantepois libera recursos no SGBD.

1 co n ex ao . c lose ( ) ;

Código C# 2.6: Finalizando uma conexão ODBC

Mais SobreEm C#, para evitar que o uma conexão não seja fechada após a sua utilização, podemosaplicar um blocousing .

1 using (O d b cCo nn ec t io n co n ex ao = ne w OdbcConnection(s tr ingDeConexao))2 {3 / / ut i l iza a co n ex ao4 }

Código C# 2.7: Utilizando um bloco using

No código acima, quando o bloco using que está associado à conexão ODBC terminar, automa-ticamente, essa conexão será fechada.

Exercícios de Fixação

www.facebook.com/k19treinamentos 27

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 38/244

ADO.NET 28

1 Crie um projeto do tipo Console Application no Microsoft Visual C# Express , chamado

ODBC.

2 Crie uma classe chamada InsereEditora no projeto ODBC para inserir registros na tabela Edi-toras .

1 using System.Data.Odbc;23 namespace Odbc4 {5 class InsereEditora6 {7 s ta tic v o id Main( string [ ] a rg s )8 {

9 string s t r in gD eCo n ex ao = @"d r iv er={SQ L Server} ;1 server=MARCELO -PC\SQLEXPRESS; database=livrar ia;u id=sa;pwd=sa;" ;1112 S yst em . Co ns ol e. Write ( " D i gi t e o N om e d a E d it o ra : " ) ;13 string n o me = Sy s tem.Co n sole .Read Lin e( ) ;1415 S yst em . Co ns ol e. Write ( " D i gi t e o E m ai l d a E di t or a : " ) ;16 string emai l = Sy s tem.Co n sole .Read Lin e( ) ;1718 string tex to In se reEd i tor a =19 @"IN SERT IN TO Ed i to r as (N o me, Email )2 VALUES(’" + n o m e + @" ’ , ’ " + e m a i l + @"’)" ;2122 using (O d b cCo nn ec t io n co n ex ao = ne w OdbcConnection(s tr ingDeConexao))23 {24 OdbcCommand command = ne w OdbcCommand( tex toInsereEditora , conexao) ;

25 conexao . Open () ;26 command .ExecuteNonQuery () ;27 }28 }29 }3 }

Código C# 2.8: InsereEditora.cs

Exercícios Complementares

1 Crie uma classe chamadaInsereLivro no projeto ODBCpara inserir registros na tabelaLivros .

SQL Injection A implementação da inserção de registros feita anteriormente possui uma falha grave. Os dados ob-tidos do usuário através do teclado não são tratados antes de serem enviados para o SGDB.

Esses dados podem conter caracteres especiais. Se esses caracteres não são tratados, o compor-tamento esperado da operação é afetado. Eventualmente, registros nãosão inseridoscomo deveriamou brechas de segurança podem se abrir.

Por exemplo, considere a classe InsereEditora do exercício de xação. Se o usuário digitar

28 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 39/244

29 ADO.NET

“O’Reilly” e “[email protected]”, o código SQL gerado pela aplicação seria:

1 IN SERT IN TO Ed i to r as ( n o me, email ) VA LUES ( ’O ’Rei l ly ’ , ’ o r e i lly @emai l . com’ )

Observe que o caractere aspas simples aparece cinco vezes no código SQL acima. O SGDB nãosaberia dizer onde de fato termina o nome da editora. Ao tentar executar esse código, um erro desintaxe é lançado pelo SQL Server. Para resolver esse problema manualmente, devemos adicionardois caracteres “”’ seguidos.

1 IN SERT IN TO Ed i to r as ( n o me, email ) VA LUES ( ’O ’’Rei l ly ’ , ’ o r e i lly @emai l . com’ )

Os valores recebidos dos usuários devem ser analisados e os caracteres especiais contidos nessesvalores devem ser tratados. Esse processo é extremamente trabalhoso, pois o conjunto de caracteresespeciais e a forma de tratá-los é diferente em cada SGDB.

A responsabilidade do tratamento dos caracteres especiais contidos nos valores de entrada dosusuários pode ser repassada para os drivers ODBC. Dessa forma, o código das aplicações se tornaindependente das particularidades desse processo para cada SGDB.

Mais SobreO processo de tratamentodos caracteres especiais das entradas dos usuários é denomi-nado sanitize .

1 / / p e ga n do o s d ad o s d a e d it o ra p el o t e cl a do2 string n o me = Sy s tem.Co n sole .Read Lin e( ) ;3 str ing emai l = Sy s tem.Co n sole .Read Lin e( ) ;45 / / d e f in in do a sen ten ça SQ L co m p arâmet ros6 string tex to D o Coman d o =7 @" I N SE RT I NTO E d it o ra s ( N om e , E ma i l ) VA LU E S ( ? , ? ) ;" ;89 / / c r ia n do u m c o ma n do o db c

1 O d b cCo mmand co man d o = ne w OdbcCommand( tex toDoComando , conexao) ;1112 / / a t r ibu in d o v a lor es ao s p a r âmet ros13 comando.Parameters . AddWithValue( "@Nome", n om e ) ;14 comando.Parameters . AddWithValue( "@Email" , email ) ;

Código C# 2.12: “Sanitizando” as entradas dos usuários

Observe que a sentença SQL foi denida com parâmetros através do caractere “?”. Antes de exe-cutar o comando, é necessário atribuir valores aos parâmetros. Isso é feito com o método AddWith-Value() . Esse método realiza a tarefa de “sanitizar” os valores enviados pelo usuário.

Exercícios de Fixação

3 Tente causar um erro de SQL Injection ao inserir editoras com a classe InsereEditora . (Dica:tente entradas com aspas simples)

www.facebook.com/k19treinamentos 29

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 40/244

ADO.NET 30

4 Altere o código da classe InsereEditora para eliminar o problema do SQL Injection. Observe ocódigo abaixo:

1 using System.Data.Odbc;

23 namespace Odbc4 {5 class InsereEditora6 {7 s ta tic v o id Main( string [ ] a rg s )8 {9 string s t r in gD eCo n ex ao = @"d r iv er={SQ L Server} ;

1 server=MARCELO -PC\SQLEXPRESS; database=livrar ia;u id=sa;pwd=sa;" ;1112 S yst em . Co ns ol e. Write ( " D i gi t e o N om e d a E d it o ra : " ) ;13 string n o me = Sy s tem.Co n sole .Read Lin e( ) ;1415 S yst em . Co ns ol e. Write ( " D i gi t e o E m ai l d a E di t or a : " ) ;16 string emai l = Sy s tem.Co n sole .Read Lin e( ) ;17

18 string tex to In se reEd i tor a =19 @"IN SERT IN TO Ed i to r as (N o me, Email ) VA LUES(? , ? ) " ;221 using (O d b cCo nn ec t io n co n ex ao = ne w OdbcConnection(s tr ingDeConexao))22 {23 OdbcCommand command = ne w OdbcCommand( tex toInsereEditora , conexao) ;2425 com ma nd . Pa ram ete rs . Ad dW it hVa lu e( "@Nome", n om e ) ;26 com ma nd . Pa ram ete rs . Ad dW it hVa lu e( "@Email" , email ) ;2728 conexao . Open () ;29 command .ExecuteNonQuery () ;3 }31 }32 }33 }

Código C# 2.13: InsereEditora.cs

5 Agora tente causar novamente o problema de SQL Injection ao inserir novas editoras.

Exercícios Complementares

2 Provoque um erro de SQL Injection na classe InsereLivro . (Dica: tente entradas com aspassimples.)

3 Altere o código para eliminar o problema do SQL Injection.

4 Agora tente causar novamente o problema de SQL Injection ao inserir novos livros.

Listando registrosDepois de inseriralguns registros, é interessante consultar os dados das tabelas para conferir se a in-serção foi realizada com sucesso.

30 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 41/244

31 ADO.NET

O processo para executar um comando de consulta é parecido com o de inserção. É necessáriodenir a sentença SQL e criar um objeto da classe OdbcCommand .

1 / / d e f in in do a sen ten ça SQ L

2 string tex to Do Co man d o = @"SELECT * FROM Ed i to r as ;";34 / / c r ia n do u m c o ma n do o db c5 O d bc C om m an d c o ma n do = ne w OdbcCommand( tex toDoComando , conexao) ;

Código C# 2.15: Criando um comando de seleção

A diferença é que para executar um comando de consulta é necessário utilizar o método Execu-teReader() ao invés do ExecuteNonQuery() . Esse método devolve um objeto da classe System.Da-ta.Odbc.OdbcDataReader .

1 O d b cDataRead er r esul tad o = co man d o .Ex ecuteRead er ( ) ;

Código C# 2.16: Executando um comando de consulta

Os dados contidos no OdbcDataReader podem ser acessados através dos nomes das colunas.

1 string n o me = r esu ltad o [ "Nome"] as s t r in g ;2 string email = r esul tad o [ "Email" ] a s s t r in g ;

Código C# 2.17: Recuperando os campos do primeiro registro do resultado

O código acima mostra como os campos do primeiro registro do resultado da consulta são recu-perados. Agora, para recuperar os outros registros é necessário avançar o OdbcDataReader atravésdo método Read() .

1 string n o me1 = r esul tad o [ "nome" ] as s t r in g ;2 string email1 = r esul tad o [ "email" ] a s s t r in g ;34 r esu ltad o .Read ( ) ;56 string n o me2 = r esul tad o [ "nome" ] as s t r in g ;7 string email2 = r esul tad o [ "email" ] a s s t r in g ;

Código C# 2.18: Recuperando os campos dos dois primeiros registros do resultado

O própriométodo Read() devolve um valor booleano para indicar se o reader conseguiu avançarpara o próximo registro. Quando esse método devolver false signica que não há mais registrospara serem recuperados.

1 while ( resu ltado .Read() )2 {3 string n o me = r esul tad o [ "nome"] as s t r in g ;4 string emai l = r esul tad o [ "email" ] a s s t r in g ;5 }

Código C# 2.19: Recuperando os campos de todos os registros do resultado

Exercícios de Fixação

www.facebook.com/k19treinamentos 31

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 42/244

ADO.NET 32

6 Insira algumas editoras utilizando a classe InsereEditora que você criou nos exercícios anteri-ores.

7 Adicione uma nova classe ao projeto ODBC chamada ListaEditora . O objetivo é listar as edi-toras que foram salvas no banco. Veja o código dessa classe.

1 using System.Data.Odbc;23 namespace Odbc4 {5 class Lis taEditora6 {7 s ta tic v o id Main( string [ ] a rg s )8 {9 string s t r in gD eCo n ex ao = @"d r iv er={SQ L Server} ;

1 server=MARCELO -PC\SQLEXPRESS; database=livrar ia;u id=sa;pwd=sa;" ;1112 using (O d b cCo nn ec t io n co n ex ao = ne w OdbcConnection(s tr ingDeConexao))13 {14 string tex to Lis taEd i tor a = "SELECT * FROM Ed i to r as";15 OdbcCommand command = ne w OdbcCommand( tex toLis taEditora , conexao) ;16 conexao . Open () ;17 O db cD at aR ea de r r es ul ta do = c om ma nd . Ex ec ut eR ea de r () ;1819 while ( resu ltado .Read() )2 {21 long ? i d = r e su l ta d o [ "Id" ] a s lo ng ?;22 string n o me = r esul tad o [ "Nome"] as s t r in g ;23 string email = r esul tad o [ "Email" ] a s s t r in g ;24 System .Console .WriteLine ( " { } : { 1} - { 2} \ n" , id ,nome,email) ;25 }26 }27 }

28 }29 }

Código C# 2.20: ListaEditora.cs

Exercícios Complementares

5 Crie uma classe para listar os livros cadastrados na base de dados.

Connection Factory

Você deve ter percebido que para cada ação executada no banco de dados, nós precisamos criaruma conexão. Isso gera um problema relacionado à string de conexão car armazenada em diversoslocais. Imagine que o driver do banco foi atualizado e mudamos a sua versão. Isso implicaria fa-zer diversas alterações no código em cada ocorrência da string de conexão, tornando o código maissuscetível a erros e dicultando a sua manutenção.

Para resolver esta situação, nós poderíamos criar uma classe responsável pela criação e distri-buição de conexões, mantendo assim uma única referência para a string de conexão, e qualqueralteração no modo em que nos conectamos à base de dados, só implica mudanças nesta classe.

32 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 43/244

33 ADO.NET

1 s ta t ic c lass ConnectionFactory2 {3 p u b lic s ta tic OdbcConnection CreateConnection()4 {

5 string d r iv e r = @ "SQ L Server " ;6 str ing s e rv i do r = @ "MARCELO -PC\SQLEXPRESS";7 string b aseDeD ad os = @"livrar ia" ;8 str ing u s ua r io = @"sa" ;9 str ing s e nh a = @"sa" ;

111 S tr in gB ui ld er c on ne ct io nS tr in g = ne w Str ingBuilder ( ) ;12 c on ne ct io nS tr in g . Ap pe nd ( "dr iver=" ) ;13 c on ne ct io nS tr in g . Ap pe nd ( d ri ve r );14 c on ne ct io nS tr in g . Ap pe nd ( ";server=" ) ;15 c o nn e ct i on S tr i ng . A p pe nd ( s e rv i do r ) ;16 c on ne ct io nS tr in g . Ap pe nd ( ";database=" ) ;17 c o nn e ct i on S tr i ng . A p pe nd ( b a s eD e Da d os ) ;18 c on ne ct io nS tr in g . Ap pe nd ( ";u id=" ) ;19 c on ne ct io nS tr in g . Ap pe nd ( u su ar io ) ;2 c on ne ct io nS tr in g . Ap pe nd ( ";pwd=" ) ;

21 c on ne ct io nS tr in g . Ap pe nd ( s en ha ) ;2223 r e turn n ew OdbcConnection(connectionStr ing .ToStr ing() ) ;24 }25 }

Código C# 2.22: ConnectionFactory.cs

Agora podemos obter uma novaconexão apenas chamando ConnectionFactory.CreateConnection() .O resto do sistema não precisa mais conhecer os detalhes sobre a conexão com o banco de dados,diminuindo o acoplamento da aplicação.

Exercícios de Fixação

8 Adicione uma nova classe chamada ConnectionFactory com seguinte código:

1 using System;2 using System.Data.Odbc;3 using System.Text;45 namespace Odbc6 {7 s ta tic c las s ConnectionFactory8 {9 public s tat ic OdbcConnection CreateConnection()

1 {11 string d r i v e r = @ "SQ L Server " ;12 string s e r vi d or = @ "MARCELO -PC\SQLEXPRESS";13 string b a s eD e Da d os = @"livrar ia" ;14 string u s ua r io = @"sa" ;15 string s e n h a = @"sa" ;1617 S tr in gB ui ld er c on ne ct io nS tr in g = ne w Str ingBuilder ( ) ;18 c on ne ct io nS tr in g. Appe nd ( "dr iver=" ) ;19 c on ne ct io nS tr in g .A pp en d( dr iv er );2 c on ne ct io nS tr in g. Appe nd ( ";server=" ) ;21 c on ne ct io nS tr in g . Ap pe nd ( s er vi do r );22 c on ne ct io nS tr in g. Appe nd ( ";database=" ) ;23 c on ne ct io nS tr in g . Ap pe nd ( b as eD eD ad os ) ;

24 c on ne ct io nS tr in g. Appe nd ( ";u id=" ) ;25 c on ne ct io nS tr in g .A pp en d( us ua ri o) ;26 c on ne ct io nS tr in g. Appe nd ( ";pwd=" ) ;

www.facebook.com/k19treinamentos 33

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 44/244

ADO.NET 34

27 c on ne ct io nS tr in g .A pp en d( se nh a) ;2829 r e turn n ew OdbcConnection(connectionStr ing .ToStr ing() ) ;3 }31 }

32 }

Código C# 2.23: ConnectionFactory.cs

9 Altere as classes InsereEditora e ListaEditora para que elas utilizem a fábrica de conexão.Execute-as novamente.

1 using System.Data.Odbc;23 namespace Odbc4 {5 class InsereEditora

6 {7 s ta tic v o id Main( string [ ] a rg s )8 {9 System .Console .Write ( " D i gi t e o N om e d a E d it o ra : " ) ;

1 str ing n o me = Sy s tem.Co n sole .Read Lin e( ) ;1112 S yst em . Co ns ol e. Write ( " D i gi t e o E m ai l d a E di t or a : " ) ;13 string emai l = Sy s tem.Co n sole .Read Lin e( ) ;1415 string tex to In se reEd i tor a =16 @"IN SERT IN TO Ed i to r as (N o me, Email ) VA LUES(? , ? ) " ;1718 using (O d b cCo nn ec t io n co n ex ao = Co n n ec t io n Fac to ry.Crea teCo nn ec t io n ( ) )19 {2 OdbcCommand command = ne w OdbcCommand( tex toInsereEditora , conexao) ;21

22 co mm an d. Par ame ter s. Ad dW it hVal ue ( "@Nome", n o me) ;23 co mm an d. Par ame ter s. Ad dW it hVal ue ( "@Email" , email ) ;2425 conexao . Open () ;26 command .ExecuteNonQuery () ;27 }28 }29 }3 }

Código C# 2.24: InsereEditora.cs

1 using System.Data.Odbc;23 namespace Odbc4 {5 class Lis taEditora6 {7 s ta tic v o id Main( string [ ] a rg s )8 {9 using (O d b cCo nn ec t io n co n ex ao = Co n n ec t io n Fac to ry.Crea teCo nn ec t io n ( ) )

1 {11 string tex to Lis taEd i tor a = "SELECT * FROM Ed i to r as";12 OdbcCommand command = ne w OdbcCommand( tex toLis taEditora , conexao) ;13 conexao . Open () ;14 O db cD at aR ea de r r es ul ta do = c om ma nd . Ex ec ut eR ea de r () ;1516 while ( resu ltado .Read() )17 {18 long ? i d = r e su l ta d o [ "Id" ] a s lo ng ?;

19 string n o me = r esul tad o [ "Nome"] as s t r in g ;2 string email = r esul tad o [ "Email" ] a s s t r in g ;21 System .Console .WriteLine ( " { } : { 1} - { 2} \ n" , id ,nome,email) ;

34 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 45/244

35 ADO.NET

22 }23 }24 }25 }26 }

Código C# 2.25: ListaEditora.cs

Exercícios Complementares

6 Altere as classesInsereLivro e ListaLivro para queelas utilizem a fábrica de conexão. Execute-as novamente.

Desaos

1 Implemente um teste que remove uma editora pelo id .

2 Implemente um teste que altera os dados de uma editora pelo id .

www.facebook.com/k19treinamentos 35

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 46/244

ADO.NET 36

36 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 47/244

ENTITY FRAMEWORK

C A P

Í T U L O

3Múltiplas sintaxes da linguagem SQL

No capítulo anterior, utilizamos conexões ODBC para fazer uma aplicação C# interagir com osSGDBs. Nessa interação, as consultas sãodenidas coma linguagem SQL. A sintaxe dessa linguagemé diferente em cada SGDB. Dessa forma, a complexidade do trabalho dos desenvolvedores aumenta.Para resolveresse problema,as consultas deveriam serdenidas através de um mecanismoindepen-dente da linguagem SQL.

Figura 3.1: Diferentes sintaxes da linguagem SQL

Orientação a Objetos VS Modelo Relacional

Outro problema na comunicação entre uma aplicação C# e um SGDB é o conito de paradigmas.Os SGDBs são organizados seguindo o modelo relacional. Por outro lado, as aplicações C# utilizam

www.facebook.com/k19treinamentos 37

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 48/244

ENTITY FRAMEWORK 38

o modelo orientado a objetos.

A transição de dados entre o modelo relacional e o modelo orientado a objetos não é simples.Para realizar essa transição, é necessário denir um mapeamento entre os conceitos desses dois pa-radigmas. Por exemplo, classes podem ser mapeadas para tabelas, objetos para registros, atributospara campos e referência entre objetos para chaves estrangeiras.

tbl_livros

id

1

2

3

4

titulo

Os Lusíadas

Vidas Secas

Dom Casmurro

O Cortiço

autor

Luís Vaz de Camões

Graciliano Ramos

Machado de Assis

Aluísio Azevedo

editora_id

1

1

3

2

tbl_editoras

id

12

3

4

nome

CulturaFTDA

Globo

Scipione

MODELO RELACIONAL

Editora

id = 1nome = Livraria Cultura

Livro

id = 1titulo = Os Lusíadasautor = Luís Vaz de

Camõeseditora = 1

Livro

id = 2titulo = Vidas Secasautor = Graciliano Ramoseditora = 1

ORIENTAÇÃO A OBJETOS

Figura 3.2: Modelo Orientado a Objetos vs Modelo Relacional

Ferramentas ORM

Para facilitar a comunicação entre aplicações C# que seguem o modelo orientado a objetos e osSGDBs que seguem o modelo relacional, podemos utilizar ferramentas que automatizam a transiçãode dados entre as aplicações e os SGDBs. Essas ferramentas são conhecidas como ferramentasORM(Object Relational Mapper ).

As ferramentasORM oferecemmecanismos de consultas independentes da linguagem SQL. Dessaforma, o acoplamento entre as aplicações e os SGDBs diminui drasticamente. As principais ferra-mentas ORM para C# utilizadas no mercado são o Entity Framework e o NHibernate. Nesse curso,utilizaremos o Entity Framework 5.0.0.

38 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 49/244

39 ENTITY FRAMEWORK

Livro

id = 1titulo = Os Lusíadasautor = Luís Vaz de

Camõeseditora = 1

Livro

id = 2titulo = Vidas Secasautor = Graciliano Ramoseditora = 1

tbl_livros

id

1

2

3

4

titulo

Os Lusíadas

Vidas Secas

Dom Casmurro

O Cortiço

autor

Luís Vaz de Camões

Graciliano Ramos

Machado de Assis

Aluísio Azevedo

editora_id

1

1

3

2

FERRAMENTAORM

Figura 3.3: Transformação dos dados do Modelo Relacional para o Modelo Orientado a Objetos

Livro

id = 1titulo = Os Lusíadasautor = Luís Vaz de

Camõeseditora = 1

Livro

id = 2titulo = Vidas Secasautor = Graciliano Ramoseditora = 1

tbl_livros

id

1

2

3

4

titulo

Os Lusíadas

Vidas Secas

Dom Casmurro

O Cortiço

autor

Luís Vaz de Camões

Graciliano Ramos

Machado de Assis

Aluísio Azevedo

editora_id

1

1

3

2

FERRAMENTAORM

Figura 3.4: Transformação dos dados do Modelo Orientado a Objetos para o Modelo Relacional

Instalando o Entity Framework

A instalação do Entity Framework em um projeto do Visual Studio 2012 pode ser facilmenterealizada através do Package Manager Console . Veja o comando de instalação a seguir.

PM> Install -Package EntityFramework -Version 5. .

Terminal 3.1: Package Manager Console

Mais SobreO Entity Framework também pode ser instalado através do Manage NuGet Packa-ges. Basicamente, o Manage NuGet Packages é a alternativa visual ao Package Manager

Console.

www.facebook.com/k19treinamentos 39

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 50/244

ENTITY FRAMEWORK 40

Figura 3.5: Manage NuGet Package

Figura 3.6: Manage NuGet Package

Conguração

O EntityFramework é fortemente baseado no conceito de “Convenção sobre Conguração”. Dessaforma, nenhuma conguração é necessária a não ser que seja necessário alterar o comportamentopadrão.

No comportamento padrão do Entity Framework, as conexões com o banco de dados apontarãopara .\ SQLEXPRESS, ou seja, para a instância do SQL Express rodando na mesma máquina que a

40 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 51/244

41 ENTITY FRAMEWORK

aplicação.

Para alterar as congurações de conexão com o banco de dados, podemos deni-las no arquivode conguração da aplicação. Para aplicações web, devemos alterar o arquivo Web.cong . Por outrolado, para aplicações desktop, devemos alterar o arquivo App.cong . Veja o exemplo abaixo.1 <? x ml v e r sio n ="1 . " ? >2 <co n f ig u ra tio n >3 < c on ne ct io nS tr in gs >4 <add5 name ="K19Context"6 providerName = "System.Data.SqlClien t"7 connectionStr ing = "Server=. \SQLEXPRESS;8 Database=k19db;9 Trusted_Connection=false;

1 U ser I d =sa ;11 Password=sa;12 Per si s t Secur i ty I n fo =t ru e ;13 Mult ip leActiveResultSets=True" />

14 < / c on n ec t io n St r in g s >15 < /co n f ig u ra tio n >

Código XML 3.1: App.cong

Quando o Entity Framework é instalado em um projeto do Visual Studio 2012, as conguraçõespadrão são inseridas explicitamente no arquivo de conguração da aplicação. Contudo, essas con-gurações são opcionais. Inclusive, podemos removê-las e mesmo assim elas serão aplicadas.

Convenções de Mapeamento

Por padrão, no Entity Framework, o mapeamento das entidades segue as regras do Code First.Considere as entidades Livro e Editora denidas abaixo.

1 p u b l ic c lass Livro2 {3 p u b lic in t L iv roID { ge t ; se t ; }4 p u b lic s t r in g Ti tulo { ge t ; se t ; }5 p u b lic d ec imal P r eco { ge t ; se t ; }6 public Ed i to r a Ed i to r a { ge t ; se t ; }7 }

Código C# 3.1: Livro.cs

1 p u b l ic c lass Editora2 {3 p u b lic in t Ed i tor a ID { ge t ; se t ; }4 p u b lic s t r in g N o me { ge t ; se t ; }5 p u b lic s t r in g E m ai l { ge t ; se t ; }6 public ICollect ion <Livro> Livros { ge t ; se t ; }7 }

Código C# 3.2: Editora.cs

As entidades devem ser “registradas” em um DbContext . Para registrar uma entidade, basta de-nir uma propriedade do tipo DbSet. Veja o exemplo abaixo.

1 public namespace EF2 {3 p u b lic c las s K 1 9 Co n tex t : D b Con tex t

www.facebook.com/k19treinamentos 41

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 52/244

ENTITY FRAMEWORK 42

4 {5 public DbSet<Editora > Editoras { ge t ; se t ; }6 public D b Se t<Liv ro > L iv ro s { ge t ; se t ; }7 }8 }

Código C# 3.3: K19Context.cs

De acordo com as convenções do Code First , as entidades Editora e Livro serão mapeadaspara tabelas chamadas Editoras e Livroes respectivamente. Observe que os nomes das entidadesforam pluralizados seguindo as regras da língua inglesa para denir os nomes das tabelas.

Além disso, por padrão,essas tabelas serão criadas em uma base de dados chamada EF.K19Context.Esse nome corresponde ao full qualied name da classe K19Context .

Mais SobrePara desabilitar a pluralização aplicada no nome das tabelas, é necessário sobrescrevero método OnModelCreating() da classe DbContext .

1 p u b l ic c lass K 1 9 Co ntex t : D b Co ntex t2 {3 public DbSet<Editora > Editoras { ge t ; se t ; }4 public D b Se t<Liv ro > L iv ro s { ge t ; se t ; }56 p ro tec ted ov er rid e v oid O n Mo d elCrea tin g ( D b Mo delBu ild e r d b Mo delBu ild e r )7 {8 d b Mo delBu ild e r.Co n v en t io ns .Remov e<Plu ra l iz ing Tab leN ameCo n v en t io n >( ) ;9 }

1 }

Código C# 3.4: K19Context.cs

Mais SobreNas próximas versões do EntityFramework, as regras de pluralizaçãopoderão serperso-nalizadas. Dessa forma, será possível, porexemplo,substituiras regrasda línguainglesa

pelas regras da língua portuguesa.

Mais SobrePodemos modicar o nome da base de dados escolhido por padrão. Para isso, bastaadicionar um construtor na classe que dene o DbContext semelhante ao mostrado

no código abaixo.

1 p u b l ic c lass K 1 9 Co ntex t : D b Co ntex t2 {3 public DbSet<Editora > Editoras { ge t ; se t ; }4 public D b Se t<Liv ro > L iv ro s { ge t ; se t ; }56 public K 1 9 Co ntex t ( ) : base ( "MinhaBaseDeDados" )7 {8 }9 }

Código C# 3.5: K19Context.cs

42 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 53/244

43 ENTITY FRAMEWORK

Primary Key

O Entity Framework assumirá como identicador de uma entidade, a propriedade cujo nomeseja ID ou EntidadeID escrito comletras maiúsculas e/ou minúsculas. Essa propriedade será mape-

ada para uma coluna denida no banco de dados como chave primária da tabela correspondente aentidade. Veja os exemplos abaixo.

1 p u b l ic c lass Livro2 {3 p u b lic in t L iv roID { ge t ; se t ; }4 }

Código C# 3.6: Livro.cs

1 p u b l ic c lass Livro2 {3 p u b lic in t ID { ge t ; se t ; }4 }

Código C# 3.7: Livro.cs

Se o tipo da propriedade utilizada como identicador de uma entidade for numérico, os valoresda coluna correspondente a essa propriedade serão gerados pelo banco de dados. Isso signica que,no SQL Server, a coluna será denida com a opção Identity .

Complex Types

Considere a seguinte entidade.

1 p u b l ic c lass Contato2 {3 p u b lic in t Co n tato ID { ge t ; se t ; }45 p u b lic s t r in g LogradouroResidencial { ge t ; se t ; }6 p u b lic s t r in g Lo g rad o u roCo mercia l { ge t ; se t ; }78 p u b lic s t r in g CEPRes iden c ial { ge t ; se t ; }9 p u b lic s t r in g CEPCo merc ia l { ge t ; se t ; }

111 public S t r ing Ba i r roRes id en c ia l { ge t ; se t ; }12 public S t r ing Ba i r ro Co merc ia l { ge t ; se t ; }13 }

Código C# 3.8: Contato.cs

Do ponto de vista da modelagemorientada a objetos, deveríamos refatorar essaclasse separandoas propriedades relacionadas aos endereços de um contato.

1 p u b l ic c lass Contato2 {3 p u b lic in t Co n tato ID { ge t ; se t ; }45 public En d ereco En d ereco Resid ec ia l { ge t ; se t ;}6 public En d ereco En d ereco Comerc ial { ge t ; se t ;}7 }

Código C# 3.9: Contato.cs

1 p u b l ic c lass Endereco2 {

www.facebook.com/k19treinamentos 43

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 54/244

ENTITY FRAMEWORK 44

3 p u b lic s t r in g Lo g rado u ro { ge t ; se t ;}4 p u b lic s t r in g C EP { ge t ; se t ;}5 p u b lic s t r in g Ba i rro { ge t ; se t ;}6 }

Código C# 3.10: Endereco.cs

Como nenhuma propriedade da classe Endereco se enquadra nas convenções de Primary Key esupondo que nenhuma propriedade tenha sido mapeada explicitamente para uma coluna denidacomo chave primária, o Entity Framework assumirá que essa classe é umComplexType. Alémdisso,um Complex Type não pode referenciar uma entidade através de uma propriedade.

As classesContato e Endereco serão mapeadas para umaúnica tabela chamada Contatoes . Essatabela possuirá a estrutura mostrada na imagem a seguir.

Figura 3.7: Mapeamento das classes Contato e Endereco

Mapeamento dos Relacionamentos

Considere as seguintes entidades.

1 p u b l ic c lass Livro2 {3 p u b lic in t L iv roID { ge t ; se t ; }45 public Ed i to r a Ed i to r a { ge t ; se t ; }6 }

Código C# 3.11: Livro.cs

1 p u b l ic c lass Editora2 {3 p u b lic in t Ed i tor a ID { ge t ; se t ; }4 }

Código C# 3.12: Editora.cs

Essas duas entidades serão mapeadas para as tabelas Livroes e Editoras . Na tabela Livroes ,será adicionada uma chave estrangeira chamada Editora_EditoraID referenciado a chave primáriada tabela Editora . Observe na imagem abaixo a estrutura das tabelas.

44 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 55/244

45 ENTITY FRAMEWORK

Figura 3.8: Mapeamento das entidades Livro e Editora

As mesmas tabelas seriam obtidas se o relacionamento fosse denido na entidade Editora aoinvés de ser denido na entidade Livro .

1 p u b l ic c lass Livro2 {3 p u b lic in t L iv roID { ge t ; se t ; }4 }

Código C# 3.13: Livro.cs

1 p u b l ic c lass Editora2 {3 p u b lic in t Ed i tor a ID { ge t ; se t ; }45 public ICollect ion <Livro> Livros { ge t ; se t ; }6 }

Código C# 3.14: Editora.cs

Também obteríamos as mesmas tabelas se o relacionamentofosse denido em ambas entidades.

1 p u b l ic c lass Livro2 {3 p u b lic in t L iv roID { ge t ; se t ; }45 public Ed i to r a Ed i to r a { ge t ; se t ; }6 }

Código C# 3.15: Livro.cs

1 p u b l ic c lass Editora2 {3 p u b lic in t Ed i tor a ID { ge t ; se t ; }45 public ICollect ion <Livro> Livros { ge t ; se t ; }6 }

Código C# 3.16: Editora.cs

Por outro lado, se na entidade Livro uma coleção de editoras for denida como propriedade ede forma análoga uma coleção de livros for denida como propriedade na entidade Editora entãouma terceira tabela será criada no banco de dados para representar esse relacionamento “muitospara muitos” (many to many).

1 p u b l ic c lass Livro2 {

www.facebook.com/k19treinamentos 45

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 56/244

ENTITY FRAMEWORK 46

3 p u b lic in t L iv roID { ge t ; se t ; }45 public ICollection <Editora > Editoras { ge t ; se t ; }6 }

Código C# 3.17: Livro.cs

1 p u b l ic c lass Editora2 {3 p u b lic in t Ed i tor a ID { ge t ; se t ; }45 public ICollect ion <Livro> Livros { ge t ; se t ; }6 }

Código C# 3.18: Editora.cs

Figura 3.9: Mapeamento das entidades Livro e Editora

Type Discovery

Quando duas entidades estão relacionadas, não é necessário que ambas sejam “registradas” noDbContext. Apenas a entidade principal necessita ser registrada. Por exemplo, considere as seguin-tes entidades.

1 p u b l ic c lass Livro2 {3 p u b lic in t L iv roID { ge t ; se t ; }4 }

Código C# 3.19: Livro.cs

1 p u b l ic c lass Editora2 {3 p u b lic in t Ed i tor a ID { ge t ; se t ; }45 public ICollect ion <Livro> Livros { ge t ; se t ; }6 }

Código C# 3.20: Editora.cs

No DbContext da aplicação, podemos registrar ambas ou apenas a entidade Editora .

1 p u b l ic c lass K 1 9 Co ntex t : D b Co ntex t2 {3 public DbSet<Editora > Editoras { ge t ; se t ; }4 public D b Se t<Liv ro > L iv ro s { ge t ; se t ; }5 }

Código C# 3.21: K19Context.cs

1 p u b l ic c lass K 1 9 Co ntex t : D b Co ntex t2 {3 public DbSet<Editora > Editoras { ge t ; se t ; }

46 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 57/244

47 ENTITY FRAMEWORK

4 }

Código C# 3.22: K19Context.cs

Se as duas entidades forem registradas, tanto os livros quanto as editoras podem ser obtidos di-retamente pelo DbContext. Agora, se apenas a entidade Editora for registrada, somente as editoraspodem ser obtidas diretamente pelo DbContext e os livros seriam obtidos somente através das edi-

toras.

Exercícios de Fixação

1 Abra o Visual Studio Express 2012 for Desktop ; Crie um projeto do tipo Console Application emC# chamado K19EntityFramework .

2 Instale o EntityFramework no projetoK19EntityFramework utilizandoo Manage Nuget Packages .

Siga o exemplo das imagens abaixo.

Figura 3.10: Manage NuGet Package

www.facebook.com/k19treinamentos 47

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 58/244

ENTITY FRAMEWORK 48

Figura 3.11: Manage NuGet Package

3 Adicione uma classe chamada Endereco no projeto K19EntityFramework .

1 namespace K19Enti tyFramework2 {3 / / co mplex ty p e4 p u b lic c las s Endereco5 {6 public s tr ing Lo g rado u ro { ge t ; se t ; }78 p u b lic in t N u mero { ge t ; se t ; }9

1 public s tr ing C E P { ge t ; se t ; }11 }12 }

Código C# 3.23: Endereco.cs

4 Adicione uma classe chamada Aluno no projeto K19EntityFramework .

1 namespace K19Enti tyFramework2 {3 p u b lic c lass Aluno4 {5 p u b lic in t A lu no ID { ge t ; se t ; }67 public s tr ing N o me { ge t ; se t ; }89 public En d ereco En d ereco { ge t ; se t ; }

1 }11 }

Código C# 3.24: Aluno.cs

48 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 59/244

49 ENTITY FRAMEWORK

5 Adicione uma classe chamada Professor no projeto K19EntityFramework .

1 namespace K19Enti tyFramework2 {3 p u b lic c lass Professor4 {5 p u b lic in t P ro f esso r ID { ge t ; se t ; }67 public s tr ing N o me { ge t ; se t ; }89 public En d ereco En d ereco { ge t ; se t ; }

1 }11 }

Código C# 3.25: Professor.cs

6 Adicione uma classe chamada Turma no projeto K19EntityFramework .

1 namespace K19Enti tyFramework2 {3 p u b lic c lass Turma4 {5 p u b lic in t Tu rmaId { ge t ; se t ; }67 p u b lic in t Vag as { ge t ; se t ; }89 public P ro fesso r P ro fes so r { ge t ; se t ; }

111 public ICollect ion <Aluno> Alunos { ge t ; se t ; }12 }13 }

Código C# 3.26: Turma.cs

7 Adicione uma classe chamada K19Context no projeto K19EntityFramework .

1 namespace K19Enti tyFramework2 {3 p u b lic c lass K 1 9 Co ntex t : D b Con tex t4 {5 public D b Se t<Tu rma> Tu rmas { ge t ; se t ; }67 public D b Se t<A lu no > A lu no s { ge t ; se t ; }89 public DbSet<Professor > Professores { ge t ; se t ; }

1 }11 }

Código C# 3.27: Turma.cs

8 Adicione uma classe chamada Teste no projeto K19EntityFramework .

1 namespace K19Enti tyFramework2 {3 p u b lic c lass Teste4 {5 s ta tic v o id Main( string [ ] a rg s )6 {

7 using ( v ar c tx = ne w K19Context( ) )8 {9 Aluno a1 = ne w Aluno

www.facebook.com/k19treinamentos 49

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 60/244

ENTITY FRAMEWORK 50

1 {11 Nome = "A man da G u err a" ,12 Endereco = ne w Endereco13 {14 Logradouro = "Ru a A male r a" ,

15 Numero = 1789 ,16 CEP = " 157- 1"17 }18 };192 Aluno a2 = ne w Aluno21 {22 Nome = "Marce lo Mar tin s" ,23 Endereco = ne w Endereco24 {25 Logradouro = "Ru a Zaul" ,26 Numero = 29 7 ,27 CEP = " 9147- 1"28 }29 };331 Professor p = ne w Professor32 {33 Nome = " Jo n as H i r ata" ,34 Endereco = ne w Endereco35 {36 Logradouro = "Ru a Merve lh a" ,37 Numero = 8367 ,38 CEP = " 876-1 "39 }4 };4142 Turma t = ne w Turma43 {44 Vagas = 1 ,45 Alunos = ne w List< Aluno >()46 };4748 t . Professor = p ;49 t . Alunos . Add (a1 ) ;5 t . Alunos . Add (a2 ) ;5152 ctx . Turmas .Add ( t) ;53 ctx . SaveChanges () ;54 }55 }56 }57 }

Código C# 3.28: Teste.cs

9 Execute o projeto K19EntityFramework e consulte o banco de dados para vericar se os dadosforam armazenados corretamente. Observe a estrutura das tabelas.

Data Annotations

Podemos utilizar anotações para sobrescrever as convenções de mapeamento. A seguir apresen-taremos as principais anotações.

50 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 61/244

51 ENTITY FRAMEWORK

Table e Column

NoEntityFramework, os nomes das tabelas e dascolunas sãodenidos porconvenção. Contudo,podemos personalizá-los de acordo com a necessidade através das anotações Table e Column .

1 [ Tab le ( " tb l_alunos" ) ]2 p u b l ic c lass Aluno3 {4 p u b lic in t A lu n oID { ge t ; se t ; }56 [ Column ( "nome_do_aluno" )]7 p u b lic s t r in g N o me { ge t ; se t ; }8 }

Código C# 3.29: Aluno.cs

Figura 3.12: Personalizando os nomes das tabelas e das colunas

A anotação Column também permite a escolha do tipo da coluna correspondente à propriedadeanotada.

1 p u b l ic c lass Produto2 {3 p u b lic in t P ro d uto ID { ge t ; se t ; }4

5 [ Column ( "descr icao_do_produto" , Ty p eN ame="tex t" ) ]6 p u b lic s t r in g D escr icao { ge t ; se t ; }7 }

Código C# 3.30: Produto.cs

Figura 3.13: Personalizando o tipo de uma coluna

DatabaseGenerated

Por 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 comportamentoatravés da anotação DatabaseGenerated .

1 p u b l ic c lass Aluno2 {3 [D a tab aseG en era ted (D atab aseG en era ted O pt io n .N o ne) ]4 p u b lic in t A lu n oID { ge t ; se t ; }56 p u b lic s t r in g N o me { ge t ; se t ; }7 }

Código C# 3.31: Aluno.cs

www.facebook.com/k19treinamentos 51

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 62/244

ENTITY FRAMEWORK 52

Key

Considere a seguinte classe.

1 p u b l ic c lass Aluno2 {3 p u b lic in t Co d ig o { ge t ; se t ; }45 p u b lic s t r in g N o me { ge t ; se t ; }6 }

Código C# 3.32: Aluno.cs

Nenhuma propriedade se enquadra nas convenções de nomenclatura de chave primária. Con-tudo,é possível denir explicitamente, qual propriedade será mapeada como chave primária atravésda anotação Key . No exemplo abaixo, a propriedade Codigo foi denida como chave da entidade.

1 p u b l ic c lass Aluno2 {3 [ Key ]4 p u b lic in t Co d ig o { ge t ; se t ; }56 p u b lic s t r in g N o me { ge t ; se t ; }7 }

Código C# 3.33: Aluno.cs

Figura 3.14: Escolhendo a chave primária explicitamente

Required

Uma propriedade pode serdenida explicitamente como obrigatória através da anotação Requi-red . No banco de dados, as colunas correspondentes às propriedades obrigatórias serão denidascom a opção not null .

1 p u b l ic c lass Aluno2 {3 p u b lic in t A lu n oID { ge t ; se t ; }

45 [ Re qu ir ed ]6 p u b lic s t r in g N o me { ge t ; se t ; }7 }

Código C# 3.34: Aluno.cs

Figura 3.15: Denindo propriedades obrigatórias

MaxLength e MinLength

52 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 63/244

53 ENTITY FRAMEWORK

1 p u b l ic c lass Aluno2 {3 p u b lic in t A lu n oID { ge t ; se t ; }4

5 [ M a xL e ng t h ( 3 ) , M i nL e ng t h (3 ) ]6 p u b lic s t r in g N o me { ge t ; se t ; }7 }

Código C# 3.35: Aluno.cs

Figura 3.16: Denindo a quantidade mínima e máxima de caracteres de uma propriedade

NotMapped

Considere a seguinte classe.

1 p u b l ic c lass Aluno2 {3 p u b lic in t A lu n oID { ge t ; se t ; }45 public D a teTime D ataD eN asc imen to { ge t ; se t ; }67 p u b lic in t I d ad e { ge t ; se t ; }89 }

Código C# 3.36: Aluno.cs

Observe que a propriedade Idade pode sercalculada a partirda propriedade DataDeNascimento .Portanto, não é necessário armazenar o valor da idade no banco de dados. Nesses casos, podemosutilizar a anotação NotMapped e indicar quais propriedades não devem ser mapeadas nas tabelas.

1 p u b l ic c lass Aluno2 {3 p u b lic in t A lu n oID { ge t ; se t ; }45 public D a teTime D ataD eN asc imen to { ge t ; se t ; }67 [ No tM app ed ]8 p u b lic in t I d ad e { ge t ; se t ; }9

1 }

Código C# 3.37: Aluno.cs

Figura 3.17: Excluindo uma propriedade no mapeamento

InverseProperty Considere as seguintes entidades.

www.facebook.com/k19treinamentos 53

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 64/244

ENTITY FRAMEWORK 54

1 p u b l ic c lass Pessoa2 {3 p u b lic in t PessoaID { ge t ; se t ; }4

5 p u b lic s t r in g N o me { ge t ; se t ; }67 public ICollect ion <Livro> LivrosPublicados { ge t ; se t ; }89 public ICollect ion <Livro> LivrosRevisados { ge t ; se t ; }

1 }

Código C# 3.38: Pessoa.cs

1 p u b l ic c lass Livro2 {3 p u b lic in t L iv roID { ge t ; se t ; }45 p u b lic s t r in g Ti tulo { ge t ; se t ; }67 public Pesso a A u tor { ge t ; se t ; }89 public Pesso a Rev iso r { ge t ; se t ; }

1 }

Código C# 3.39: Livro.cs

Nesse caso, como o Entity Framework não consegue combinar as propriedades das duas entida-des para estabelecer dois relacionamentos bidirecionais, ele criará no banco de dados quatro chavesestrangeiras, uma para cada propriedade de navegação das entidades Pessoa e Livro .

Figura 3.18: Relacionamentos não combinados

Para agrupar as propriedades de navegação das entidades Pessoa e Livro , devemos utilizar aanotação InverseProperty . Observe o código a seguir.

1 p u b l ic c lass Pessoa2 {3 p u b lic in t PessoaID { ge t ; se t ; }45 p u b lic s t r in g N o me { ge t ; se t ; }67 [ I nv er se Pr op er ty ( "Autor" ) ]8 public ICollect ion <Livro> LivrosPublicados { ge t ; se t ; }9

1 [ I nv er se Pr op er ty ( "Revisor" ) ]11 public ICollect ion <Livro> LivrosRevisados { ge t ; se t ; }12 }

Código C# 3.40: Pessoa.cs

1 p u b l ic c lass Livro

54 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 65/244

55 ENTITY FRAMEWORK

2 {3 p u b lic in t L iv roID { ge t ; se t ; }45 p u b lic s t r in g Ti tulo { ge t ; se t ; }6

7 public Pesso a A u tor { ge t ; se t ; }89 public Pesso a Rev iso r { ge t ; se t ; }

1 }

Código C# 3.41: Livro.cs

Figura 3.19: Relacionamentos combinados com InverseProperty

Exercícios de Fixação

10 Altere a classe Aluno do projeto K19EntityFramework .

1 namespace K19Enti tyFramework2 {3 [ Table ( " tb l_alunos" ) ]4 p u b lic c lass Aluno5 {6 p u b lic in t A lu no ID { ge t ; se t ; }78 [ Required ]9 public s tr ing N o me { ge t ; se t ; }

111 public En d ereco En d ereco { ge t ; se t ; }12 }13 }

Código C# 3.42: Aluno.cs

11 Apague a base de dadosK19EntityFramework.K19Context e execute novamente o projeto. Ob-serve as modicações na estrutura da tabela Alunoes que passará a se chamar tbl_alunos . Observeque agora a coluna Nome não pode possuir valores nulos.

Gerenciamento de entidades

As instâncias das entidades de uma aplicação que utiliza o Entity Framework são administradaspor objetos do tipo DbContext . Esses objetos sãoresponsáveispelas operaçõesde inserção, remoção,alteração e consulta. A seguir, mostraremos o funcionamento básico de um DbContext .

www.facebook.com/k19treinamentos 55

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 66/244

ENTITY FRAMEWORK 56

A primeira regra básica sobre os DbContexts é sempre utilizá-los dentro de um bloco using paraevitar que os recursos utilizados por eles não sejam devidamente fechados.

1 using ( v ar c o nt e xt = ne w K19Context( ) )

2 {3 / / u t il i zand o o D bCo n tex t4 }

Código C# 3.43: Utilizando um DbContext dentro do bloco using

Persistindo

Para indicar que determinado objeto deve ser persistido no banco de dados, devemos utilizaro método System.Data.Entity.DbSet.Add() , passando o objeto em questão como parâmetro. Omé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étodoSaveChanges() do DbContext . Todos os objetos do contexto que estejam no estado Added são inse-ridos no banco de dados quando o método SaveChanges() é chamado.

1 E d it o ra e d it o ra = ne w E d it o ra { N om e = "K19", E ma il = "[email protected]" };23 / / A d ic i on a a e d it o ra c r ia d a a o c o nt e xt o c om e s ta d o A dd e d4 co n tex t .Ed i to r as .A dd (ed i tor a ) ;56 / / S i nc r on i za o c o nt e xt o c om o b an c o d e d ad o s7 co n tex t .Sav eCh an g es ( ) ;

Código C# 3.44: Persistindo um objeto

Buscando

Para obter um objeto que contenha informações do banco de dados, basta utilizar o métodoFind() do DbSet. Devemos passar o identicador do objeto que desejamos recuperar como parâ-metro para esse método.

1 Ed i to r a ed i to r a = co n tex t .Ed i to r as .F ind (1 ) ;

Código C# 3.45: Buscando uma editora com o identicador 1

RemovendoPara indicar que determinado objeto deve ser removido, basta utilizar o método System.Da-

ta.Entity.DbSet.Remove() . Esse método marca o objeto para ser removido do banco de dados,colocando-o no estado Deleted.

Quandoo método SaveChanges() é chamado, todas os objetos no estado Deleted são removidosdo banco de dados.

1 Ed i to r a ed i to r a = co n tex t .Ed i to r as .F ind (1 ) ;23 / / M a rc a a e d it o ra q ue d ev e s er r e mo v id a4 co n tex t .Ed i to r as .Remo v e(ed i to r a ) ;

56 / / S i nc r on i za o c o nt e xt o c om o b an c o d e d ad o s7 co n tex t .Sav eCh an g es ( ) ;

56 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 67/244

57 ENTITY FRAMEWORK

Código C# 3.46: Removendo uma editora do banco de dados

AtualizandoPara alterar os dados do registro correspondente a um objeto, basta modicar as suas proprieda-

des. Quando as propriedades de um objeto do contexto são alteradas, o estado Modied é associadoa este objeto. Objetos no estado Modified são atualizados no banco de dados quando o métodoSaveChanges() é chamado.

1 Ed i to r a ed i to r a = co n tex t .Ed i to r as .F ind (1 ) ;23 / / Mo d i f icand o as p ro p r ied ad es d e u m o b jeto4 e d it o ra . N om e = "A b r il S /A " ;56 / / S i nc r on i za o c o nt e xt o c om o b an c o d e d ad o s

7 co n tex t .Sav eCh an g es ( ) ;

Código C# 3.47: Alterando o nome de uma editora

Listando

Para obter uma listagem com todos os objetos referentes aos registros de uma tabela, podemosutilizar a Language Integrated Query (LINQ), que nos permite escrever consultas dentro do códigoC#.

1 v ar c on su lt a = f ro m e in contex t .Editoras2 where e . Nome . Contains ( "A")3 select e ;45 / / E q ui v al e nt e a : S E LE C T * F RO M E d it o ra s e w he re e . N om e L ik e ’ A %’6 foreach (v a r i t em in consulta)7 {8 S y st e m . Co n so l e . Wr i te L in e ( "Ed i to r a : " + i t em.N o me) ;9 }

Código C# 3.48: Utilizando LINQ para fazer uma consulta

Exercícios de Fixação

12 Adicione uma classe no projeto K19EntityFramework chamada InsereAluno .

1 namespace K19Enti tyFramework2 {3 p u b lic c lass InsereAluno4 {5 s ta tic v o id Main( string [ ] a rg s )6 {7 using ( v ar c tx = ne w K19Context( ) )8 {9 Console . WriteLine ( " D i gi t e o n om e d o a lu n o " ) ;

1 str ing n o me = Co n so le .ReadLin e( ) ;11

12 Console . WriteLine ( " D i gi t e o l o gr a do u ro d o e n de r eç o d o a lu n o " ) ;13 string lo g rad o uro = Co n so le .ReadLin e( ) ;14

www.facebook.com/k19treinamentos 57

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 68/244

ENTITY FRAMEWORK 58

15 Console . WriteLine ( " D i gi t e o n ú me r o d o e n de r eç o d o a lu n o " ) ;16 in t n u mero = In t32 .Par se (Co nso le .Read Line( ) ) ;1718 Console . WriteLine ( " D i gi t e o C EP d o e n de r eç o d o a l u no " ) ;19 string cep = Co n so le .ReadLin e( ) ;

221 Aluno a = ne w Aluno22 {23 Nome = nome ,24 Endereco = ne w Endereco25 {26 Logradouro = logradouro ,27 Numero = numero ,28 CEP = cep29 }3 };3132 ctx . Alunos .Add (a) ;33 ctx . SaveChanges () ;34 }3536 }37 }38 }

Código C# 3.49: InsereAluno.cs

Naspropriedadesdo projetoK19EntityFramework, altereo statupobject selecionandoa classeInsereAluno. Depoisexecute o projeto.

13 Adicione uma classe no projeto K19EntityFramework chamada ListaAluno.

1 using System.Linq;2 namespace K19Enti tyFramework3 {4 p u b lic c lass Lis taAluno5 {6 s ta tic v o id Main( string [ ] a rg s )7 {8 using ( v ar c tx = ne w K19Context( ) )9 {

1 var consulta = from a in c tx .A lun o s se lec t a ;1112 foreach ( A l un o a in consulta)13 {14 Console . WriteLine ( " N o m e : " + a . N om e ) ;15 Console . WriteLine ( "Lo g rado u ro : " + a .En d ereco .Lo g rad o u ro ) ;16 Console . WriteLine ( "N ú mero : " + a .En d ereco .N u mero ) ;17 Console . WriteLine ( " C EP : " + a .En d ereco .CEP) ;18 Console . WriteLine ( "- - - - - - - - - - - - - - - - - - - - - - - - - - - - -" ) ;19 }2 }21 }22 }23 }

Código C# 3.50: ListaAluno.cs

Naspropriedadesdo projetoK19EntityFramework, altereo statup object selecionandoa classeListaAluno. Depois execute o projeto.

14 Adicione uma classe no projeto K19EntityFramework chamada AlteraAluno.

58 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 69/244

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 70/244

ENTITY FRAMEWORK 60

Design).

Conceitualmente, um repositório representa o conjunto de todos os objetos de um determinadotipo. Ele deve oferecer métodos para administrar seus elementos.

Os repositórios podem trabalhar com objetos prontos na memória ou reconstruí-los com dadosobtidos de um banco de dados. O acesso ao banco de dados pode ser realizado através de umaferramenta ORM como o Entity Framework.

1 using System;2 using System.Collect ions .Gener ic;3 using System.Linq;4 using System.Data.Enti ty ;56 namespace K1 97 {8 p u b lic c lass EditoraRepository9 {

1 DbContext contex t ;1112 public EditoraRepository(DbContext contex t)13 {14 this . co n tex t = co n tex t ;15 }1617 p u b lic v o id A d ic io n a(Ed ito r a e )18 {19 contex t .Set <Editora >() . Add (e) ;2 contex t . SaveChanges () ;21 }2223 public Ed i to ra Bu sca( in t id )24 {25 return contex t .Set<Editora >() .Find( id) ;26 }2728 public Lis t<Editora > BuscaTodas( )29 {3 var consulta = from e in conte xt. Set< Editora >()31 select e ;32 return consulta .ToLis t( ) ;33 }34 }35 }

Código C# 3.53: EditoraRepository.cs

1 v ar c on te xt = ne w K19Context( ) ;

23 Ed i to raRep os i to ry r ep o s i tory = ne w EditoraRepository(contex t) ;45 L is t<Ed i to r a > ed i tor as = r ep o si to ry.Bu scaTo das ( ) ;

Código C# 3.54: Buscando todas as editoras armazenadas no banco de dados

60 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 71/244

CODE FIRST MIGRATIONS

C A P

Í T U L O

4Code First Migrations

O Entity Framework Code First da Microsoft tem uma funcionalidade que permite controlar asmudanç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 .

O Code First Migrations foi adicionado na versão 4.3.1 do Entity Framework. Neste capítulo uti-lizaremos o Entity Framework 5.0.

Passo a Passo

Para testar o funcionamento do Code First Migrations, criaremos um projeto no Visual Studio.

Agora, devemos instalar o Entity Framework5.0. Para isso, utilizaremos o gerenciador de pacotesNuget do Visual Studio.

www.facebook.com/k19treinamentos 61

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 72/244

CODE FIRST MIGRATIONS 62

O Nuget permite que bibliotecas e ferramentas sejam instaladas no Visual Studio. Ao instalarpacotes no seu projeto, ele adiciona as bibliotecas, referências e faz as alterações necessárias nos ar-quivos de conguração. Mais informações sobre o Nuget e os pacotes disponíveis, acesse o endereçohttp://nuget.org/packages

Para instalar o Entity Framework 5.0, basta selecionar o pacote Entity Framework e clicar emInstall .

62 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 73/244

63 CODE FIRST MIGRATIONS

Após a instalação do Entity Framework5.0, adicionaremosuma classe de modelo chamadaEditora .Essa entidade será mapeada através de umaclasse chamada K19Context . Para testar, criaremos uma

classe com o método Main() . Observe o código dessas três classes.1 namespace EFMigrat ions2 {3 p u b lic c las s Editora4 {5 p u b lic in t Id { ge t ; se t ; }6 public s tr ing N o me { ge t ; se t ; }7 public s tr ing Emai l { ge t ; se t ; }8 }9 }

Código C# 4.1: Editora.cs

1 namespace EFMigrat ions2 {3 p u b lic c las s K 1 9 Co n tex t : D b Con tex t4 {5 public DbSet<Editora > Editoras { ge t ; se t ; }6 }7 }

Código C# 4.2: K19Context.cs

1 namespace EFMigrat ions2 {3 class Program4 {

5 s ta tic v o id Main( string [ ] a rg s )6 {7 using ( v a r c o nt e xt = ne w K19Context( ) )

www.facebook.com/k19treinamentos 63

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 74/244

CODE FIRST MIGRATIONS 64

8 {9 Editora e = ne w E d it o ra { N om e = "K19",

1 Email = "[email protected]" };11 contex t .Editoras .Add (e );12 contex t .SaveChanges () ;

13 }14 }15 }16 }

Código C# 4.3: Program.cs

Após a execução do projeto, teremos a seguinte tabela e banco de dados.

O próximo passo é alterar a classe de modelo Editora .

1 namespace EFMigrat ions2 {3 p u b lic c las s Editora4 {5 p u b lic in t Id { ge t ; se t ; }6 public s tr ing N o me { ge t ; se t ; }7 public s tr ing Emai l { ge t ; se t ; }89 p u b lic s t r in g Te le fo n e { ge t ; se t ; }

1 }11 }

Código C# 4.4: Editora.cs

Com a alteração na classe Editora , um exeção é gerada ao executar o projeto.

64 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 75/244

65 CODE FIRST MIGRATIONS

Para resolveresse problema, o banco de dados precisa ser atualizado. Para fazer essa atualização,o Entity Framework recomenda a utilização da ferramenta Code First Migrations.

O primeiro passo para utilizar Code First Migrations é habilitá-lo e adicioná-lo ao projeto atravésdo Package Manager Console.

O comando Enable-Migrations adiciona umapasta chamada Migrations no projeto. Esta pastacontém dois arquivos.

• A classe Configuration permite denir o comportamento do Code First Migrations para onosso contexto.

• A classe parcial InitialCreate dene a primeira versão das tabelas do banco de dados.

O Code First Migration tem dois comandos fundamentais.

www.facebook.com/k19treinamentos 65

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 76/244

CODE FIRST MIGRATIONS 66

• Add-Migration que gera o código necessário para atualizar o banco de dados de acordo comas alterações nas classes de modelo.

• Update-Database aplica as alterações pendentes no banco de dados.

Após adicionarmos a propriedade Telefone à classeEditora , devemos adicionar uma Migration ao projeto para atualizar o banco de dados e adicionar uma nova coluna à tabela Editoras . Paraadicionar uma Migration , devemos utilizar o comando Add-Migration . Para atualizar o banco dedados com as alterações denidas na Migration , devemos utilizar o comando Update-Database .

Para utilizar o comando Add-Migration é necessário denir o nome da Migration a ser adicio-nada.

O nome da Migration que adicionaremos será AddTelefoneToEditora .

A classe que dene a migração é adicionada à pasta Migrations .

66 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 77/244

67 CODE FIRST MIGRATIONS

Para atualizar o banco de dados com as alterações denidas na Migration , devemos executar ocomando Update-Database .

Uma nova coluna é adicionada à tabela Editoras no banco de dados.

Exercícios de Fixação

1 Crie um projeto do tipo Console Application chamado CodeFirstMigrations no Visual Studio2012 Express for Desktop .

2 Adicioneo EntityFramework aoprojetoCodeFirstMigrations através do Manage Nuget Packages .

www.facebook.com/k19treinamentos 67

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 78/244

CODE FIRST MIGRATIONS 68

3 Após adicionar o Entity Framework ao projeto, crie a classe Editora .

1 using System.ComponentModel .DataAnnotat ions;23 namespace CodeFirs tMigrat ions4 {5 class Editora6 {7 p u b lic in t Id { ge t ; se t ; }8 [ Re qu ir ed ( Er ro rM es sa ge = " O c am p o n om e é o b ri g at ó ri o " ) ]9 public s tr ing N o me { ge t ; se t ; }

1 [ Re qu ir ed ( Er ro rM es sa ge = " O c am p o e m ai l é o b ri g at ó ri o " ) ]11 public s tr ing Emai l { ge t ; se t ; }12 }13 }

Código C# 4.5: Editora.cs

4 Crie uma classe K19Context e adicione a propriedade DbSet para mapear a entidade Editora .

1 using System.Data.Enti ty ;23 namespace CodeFirs tMigrat ions4 {5 class K 1 9 Co ntex t : D b Con tex t6 {7 public DbSet<Editora > Editoras { ge t ; se t ; }8 }9 }

Código C# 4.6: K19Context.cs

5 Crie uma classe Program de teste para cadastrar as editoras.

1 using System;2 using System.Collect ions .Gener ic;3 using System.Linq;4 using System.Text;5 using System.Threading .Tasks;67 namespace CodeFirs tMigrat ions8 {9 class Program

1 {11 s ta tic v o id Main( string [ ] a rg s )12 {13 using ( v a r c o nt e xt = ne w K19Context( ) )14 {15 Console . WriteLine ( " D i gi t e o n om e d a E d it o ra : " ) ;16 string n o me = Co n so le .ReadLin e( ) ;17 Console . WriteLine ( " D i gi t e o e ma i l d a E d it o ra : " ) ;18 string emai l = Co n so le .ReadLin e( ) ;19 Editora e = ne w E di t or a { N om e = n om e , E ma il = e m ai l } ;2 contex t .Editoras .Add (e );21 contex t .SaveChanges () ;22 }2324 }25 }26 }

Código C# 4.7: Program.cs

68 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 79/244

69 CODE FIRST MIGRATIONS

Execute o projeto e cadastre uma editora.

6 Altere a classe Editora adicionando a propriedade Telefone .

1 using System.ComponentModel .DataAnnotat ions;23 namespace CodeFirs tMigrat ions4 {5 p u b lic c las s Editora6 {7 p u b lic in t Id { ge t ; se t ; }8 [ Re qu ir ed ( Er ro rM es sa ge = " O c am p o n om e é o b ri g at ó ri o " ) ]9 public s tr ing N o me { ge t ; se t ; }

1 [ Re qu ir ed ( Er ro rM es sa ge = " O c am p o e m ai l é o b ri g at ó ri o " ) ]11 public s tr ing Emai l { ge t ; se t ; }12 p u b lic s t r in g Te le fo n e { ge t ; se t ; }13 }14 }

Código C# 4.8: Editora.cs

7 Execute novamente o projeto. Veriquequeumaexceção do tipoSystem.InvalidOperationExceptionocorrerá.

8 Para corrigir o problema visto no exercício anterior, devemos habilitar o Code First Migrations .Para isso, execute o seguinte comando através do Package Manager Console .

Enable-Migrations .

www.facebook.com/k19treinamentos 69

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 80/244

CODE FIRST MIGRATIONS 70

Verique que uma pasta chamada Migrations comdois arquivos: <DATA>_InitialCreate.cs e Con- guration.cs foi gerada no projeto CodeFirstMigrations .

9 Após habilitar o Code First Migrations no projeto CodeFirstMigrations , devemos adicionaruma migração para atualizar o banco de dados adicionando a coluna Telefone na tabela Editoras .Crie uma migração chamada AddTelefoneToEditora através do comando Add-Migration . Executeeste comando através do Package Manager Console .

Verique que um arquivo de migração foi criado na pasta Migrations :

1 namespace CodeFirs tMigrat ions .Migrat ions2 {3 using System;

4 using System.Data.Enti ty.Migrat ions;56 public par t ia l class A d d Tele fo n eTo Ed ito r a : D b Migra t ion

70 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 81/244

71 CODE FIRST MIGRATIONS

7 {8 p u b lic o v er rid e v o id Up()9 {

1 AddColumn ("dbo.Editoras" , "Telefone" , c = > c . S t r in g ( ) );11 }

1213 p u b lic o v er rid e v o id Down()14 {15 DropColumn ("dbo.Editoras" , "Telefone" ) ;16 }17 }18 }

Código C# 4.9: <DATA>_AddTelefoneToEditora.cs

10 Para atualizar a tabela Editoras no banco de dados, utilize o comando Update-Database que éexecutado através do Package Manager Console.

Verique que a coluna Telefone foi adicionada a tabela Editoras .

Acrescentando uma nova entidade

O Code First Migrations gerencia as alterações no modelo e a adição de novas entidades. Aoadicionar uma nova entidade ao projeto, devemos criar uma Migration que adicionará uma novatabela para o qual a classe será mapeada. Considere a seguinte classe para denir a entidade Livro.

1 namespace EFMigrat ions2 {3 p u b lic c las s Livro4 {5 p u b lic in t Id { ge t ; se t ; }6 public s tr ing Ti tulo { ge t ; se t ; }7 public decimal P r eco { ge t ; se t ; }8 p u b lic in t Ed i to ra Id { ge t ; se t ; }9 public Ed i to r a Ed i to r a { ge t ; se t ; }

1 }11 }

Código C# 4.10: Livro.cs

Para estabelecer o relacionamento entre as entidades Editora e Livro, a classe Editora deveráser alterada.

1 namespace EFMigrat ions2 {

www.facebook.com/k19treinamentos 71

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 82/244

CODE FIRST MIGRATIONS 72

3 p u b lic c las s Editora4 {5 p u b lic in t Id { ge t ; se t ; }6 public s tr ing N o me { ge t ; se t ; }7 public s tr ing Emai l { ge t ; se t ; }

8 public s tr ing Te le fo n e { ge t ; se t ; }91 [ ForeignKey ( "EditoraId" ) ]11 p u b lic v i r tu a l IL is t<Liv ro > L iv ro s { ge t ; se t ; }12 }13 }

Código C# 4.11: Editora.cs

Devemos mapear a entidade Livro na classe K19Context.

1 namespace EFMigrat ions2 {3 p u b lic c las s K 1 9 Co n tex t : D b Con tex t4 {5 public DbSet<Editora > Editoras { ge t ; se t ; }6 public D b Se t<Liv ro > L iv ro s { ge t ; se t ; }7 }8 }

Código C# 4.12: Livraria.cs

Após a criação da classe que dene a entidade Livroeaalteraçãodasclasses Editora e K19Context ,devemos criar uma Migration que atualizará o banco de dados criando uma nova tabela para o quala classe Livro será mapeada.

Para adicionar a nova Migration , execute o seguinte comando:

Add-Migration CreateLivro

Paraatualizaro bancode dados e criar a nova tabela, devemos utilizaro comando Update-Database .

72 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 83/244

73 CODE FIRST MIGRATIONS

Após executar o comandoUpdate-Database , verique que a tabela para o qual a classe Livro foimapeada foi criada no banco de dados.

Exercícios de Fixação

11 Acrescente a classe Livro conforme o código abaixo:

1 namespace CodeFirs tMigrat ions2 {3 class Livro4 {5 p u b lic in t Id { ge t ; se t ; }6 public s tr ing Ti tulo { ge t ; se t ; }7 public decimal P r eco { ge t ; se t ; }8 p u b lic in t Ed i to ra Id { ge t ; se t ; }9 public Ed i to r a Ed i to r a { ge t ; se t ; }

1 }11 }

Código C# 4.13: Livro.cs

12 Altere a classe K19Context para mapear a classe Livro para uma tabela no banco de dados.

1 using System.Data.Enti ty ;2

3 namespace CodeFirs tMigrat ions4 {5 class K 1 9 Co ntex t : D b Con tex t

www.facebook.com/k19treinamentos 73

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 84/244

CODE FIRST MIGRATIONS 74

6 {7 public DbSet<Editora > Editoras { ge t ; se t ; }8 public D b Se t<Liv ro > L iv ro s { ge t ; se t ; }9 }

1 }

Código C# 4.14: K19Context.cs

13 Para gerar a tabela Livros no banco de dados, devemos criar uma migração. Crie uma migraçãochamada CreateLivro através do comando Add-Migration .

14 Executeo comandoUpdate-Database através do Package Manager Console paragerar a tabelareferente a classe Livro no banco de dados.

Verique que a tabela referente a classe Livro foi gerada no banco de dados.

Operações do Code First Migrations

O Code First Migrations cria automaticamente as Migrations de acordo com as alterações rea-lizadas nas classes que representam as entidades. Porém, as Migrations podem ser alteradas pararealizar outras operações, como executar scripts SQL ou adicionar um indíce, por exemplo. Segueabaixo uma relação das operações que podem ser executadas durante uma Migration:

74 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 85/244

75 CODE FIRST MIGRATIONS

Operações DescriçãoAddColumn Adiciona uma coluna a uma tabela existenteAddForeignKey Cria uma chave estrangeiraAddPrimaryKey Cria uma chave primáriaAlterColumn Altera a denição de uma coluna existenteCreateIndex Cria um índice para uma coluna existenteCreateTable Cria uma nova tabela no banco de dadosDropColumn Remove uma coluna existenteDropForeignKey Remove uma chave estrangeira existenteDropIndex Remove um índice existenteDropPrimaryKey Remove uma chave primária existenteDropTable Remove uma tabela existenteMoveTable Move a tabela para um novo schema de banco de dadosRenameColumn Renomeia uma coluna existente

RenameTable Renomeia uma tabela existenteSql Executa um comando SQL

Exercícios de Fixação

15 Crie um projeto do tipo Console Application chamado CustomizandoCodeFirstMigrations no Visual Studio 2012 Express for Desktop .

16 Adicione ao projeto o Entity Framework através do Manage Nuget Packages .

17 Crie uma classe para representar a entidade Pessoa .

1 namespace CustomizandoCodeFirs tMigrat ions2 {3 p u b lic c las s Pessoa4 {5 p u b lic in t Id { ge t ; se t ; }6 public s tr ing N o me { ge t ; se t ; }7 public s tr ing Emai l { ge t ; se t ; }8 public s tr ing Te le fo neF ix o { ge t ; se t ; }9 public s tr ing Ce lula r { ge t ; se t ; }

1 }11 }

Código C# 4.15: Pessoa.cs

18 Crie uma classe K19Context para mapear a entidade Pessoa para o banco de dados.

1 namespace CustomizandoCodeFirs tMigrat ions2 {3 p u b lic c las s K 1 9 Co n tex t : D b Con tex t4 {

5 public D b Se t<Pesso a> Pesso as { ge t ; se t ; }6 }7 }

www.facebook.com/k19treinamentos 75

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 86/244

CODE FIRST MIGRATIONS 76

Código C# 4.16: K19Context.cs

19 Crie uma classe de teste que persiste um objeto da classe Pessoa no banco de dados.

1 namespace CustomizandoCodeFirs tMigrat ions2 {3 class Program4 {5 s ta tic v o id Main( string [ ] a rg s )6 {7 using ( v a r d b = ne w K19Context( ) )8 {9 Pessoa p = ne w P e ss o a { N om e = "K19", E ma il = "[email protected]" ,

1 Celular = " (11 ) 2 3 87 -3 7 9 1 " , Te le fo n eF ix o = " (11 ) 2 3 8 7 -37 9 2 " };11 db . Pessoas .Add (p) ;12 db . SaveChanges () ;13 }14 }15 }16 }

Código C# 4.17: Pessoa.cs

20 Altere a classePessoa para tornar obrigatório a propriedade TelefoneFixo. Renomeie também apropriedade Celular para TelefoneCelular .

1 namespace CustomizandoCodeFirs tMigrat ions2 {3 p u b lic c las s Pessoa4 {5 p u b lic in t Id { ge t ; se t ; }6 public s tr ing N o me { ge t ; se t ; }7 public s tr ing Emai l { ge t ; se t ; }8 [ Required ]9 public s tr ing Te le fo neF ix o { ge t ; se t ; }

1 p u b lic s t r in g Te le fo n eCelu lar { ge t ; se t ; }11 }12 }

Código C# 4.18: Pessoa.cs

21 Para que as alterações sejam reetidas no banco de dados, é necessário habilitar o Code First Mi-grations no projeto. Execute o comandoEnable-Migrations através do Package Manager Console .

22 Após habilitar oCodeFirst Migrations no projeto, crie uma Migration queefetuará as operaçõesde alteração no banco de dados. Execute o comando Add-Migration AlteraTelefoneFixoERenomei-aCelularDePessoa

23 Após a execução do comando Add-Migration , verique que o arquivo criado irá remover acoluna Celular da tabela, ao invés de renomeá-la.

1 namespace CustomizandoCodeFirs tMigrat ions .Migrat ions

76 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 87/244

77 CODE FIRST MIGRATIONS

2 {3 using System;4 using System.Data.Enti ty.Migrat ions;56 public par t ia l class AlteraTelefoneFixoERenomeiaCelu larDePessoa : DbMigrat ion

7 {8 p u b lic o v err id e v o id Up()9 {

1 AddColumn ("dbo.Pessoas" , "TelefoneCelu lar" , c = > c . S t r in g ( ) );11 AlterColumn ( "dbo.Pessoas" , "TelefoneFixo" , c => c .S t r in g (n u l lab le : false ) ) ;12 DropColumn ("dbo.Pessoas" , "Celu lar" ) ;13 }1415 p u b lic o v err id e v o id Down()16 {17 AddColumn ("dbo.Pessoas" , "Celu lar" , c = > c . S t r in g ( )) ;18 AlterColumn ( "dbo.Pessoas" , "TelefoneFixo" , c = > c . S t r i n g ( ) ) ;19 DropColumn ("dbo.Pessoas" , "TelefoneCelu lar" ) ;2 }21 }22 }

Código C# 4 .19: yyyyymmdds_AlteraTelefoneFixoERenomeiaCelularDePessoa.cs

Altere o arquivo de Migration para renomear a coluna, utilizando o método Rename.

1 namespace CustomizandoCodeFirs tMigrat ions .Migrat ions2 {3 using System;4 using System.Data.Enti ty.Migrat ions;56 public par t ia l class AlteraTelefoneFixoERenomeiaCelu larDePessoa : DbMigrat ion7 {8 p u b lic o v err id e v o id Up()9 {

1 RenameColumn ("dbo.Pessoas" , "Celu lar" , "TelefoneCelu lar" ) ;11 AlterColumn ( "dbo.Pessoas" , "TelefoneFixo" , c => c .S t r in g (n u l lab le : false ) ) ;12 }1314 p u b lic o v err id e v o id Down()15 {16 RenameColumn ("dbo.Pessoas" , "TelefoneCelu lar" , "Celu lar" ) ;17 AlterColumn ( "dbo.Pessoas" , "TelefoneFixo" , c = > c . S t r i n g ( ) ) ;18 }19 }2 }

Código C# 4 .20: yyyyymmdds_AlteraTelefoneFixoERenomeiaCelularDePessoa.cs

24 Após a alteração do arquivo deMigration , execute o comando Update-Database para alterar ascolunas no banco de dados e, posteriormente, verique que as colunas foram renomeadas.

Migração para uma versão especíca

O Code First Migrations permite ao desenvolvedor fazer a migração para uma versão espe-cíca. É possível, por exemplo, desfazer as alterações e voltar para uma versão anterior através docomando Update-Database . Basta deniro nome da versãoatravés do parâmetro -TargetMigration :

• Update-Database -TargetMigration: {NomeDaMigrationAnterior}

www.facebook.com/k19treinamentos 77

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 88/244

CODE FIRST MIGRATIONS 78

É possível tambémvoltarpara o estadoinicialdo bancode dados,executando o comando Update-Database -TargetMigration:$InitialDatabase .

Gerando Script SQLO Code First Migrations executa as alterações no banco de dados através do comando Update-Database . O comando Update-Database gera script SQL também, basta adicionar o parâmetro-Script , que ao invés de executar o comando diretamente no banco de dados, ele irá gerar o scriptSQL que poderá ser visualizado ou salvo pelo usuário através do Visual Studio.

• Update-Database -Script -TargetMigration:AddTelefoneToEditora

Através do comandoUpdate-Database é possível denir o estado inicial e a versão nal para que

o script SQL contenha todas as alterações necessárias para atualizar o banco de dados.

• Update-Database-Script -SourceMigration:$InitialDatabase-TargetMigration:AddTelefone-ToEditora

78 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 89/244

V ISÃO GERAL DO ASP.NET MVC C A P

Í T U L O

5Necessidades de uma aplicação web

HTTP

Os usuários de uma aplicação web utilizam navegadores (browsers ) para interagir com essa apli-cação. A comunicação entre navegadores e uma aplicação web é realizada através de requisições erespostas denidas peloprotocolo HTTP. Dessa forma, os desenvolvedoresde aplicações webdevemestar preparados para trabalhar com o protocolo HTTP.

Acesso simultâneo

Além disso, na grande maioria dos casos, as aplicações web devem ser acessadas por diversosusuários ao mesmo tempo. Consequentemente, os desenvolvedores web devem criar ou utilizaralgum mecanismo eciente que permita esse tipo de acesso.

Conteúdo dinâmico

As páginas de uma aplicação web devem ser geradas dinamicamente. Por exemplo, quando umusuário de uma aplicação de email acessa a sua caixa de entrada, ele deseja ver todos os emailsenviados até aquele momento. A página contendo a lista de emails deve ser gerada novamente todavez que essa página for requisitada. Consequentemente, os desenvolvedores web devem criar ouutilizar algum mecanismo eciente quepermitaqueo conteúdo das páginas das aplicações web sejagerado dinamicamente.

www.facebook.com/k19treinamentos 79

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 90/244

V ISÃO GERAL DO ASP.NET MVC 80

Aplica çãoWeb

R e q u

i s i ç ã o

H T T P

R e s p o s t a H T T P

R e q u i s i ç ã o

H T T P

R e s p o s t a H T T P R e q u i s i ç ã o H T T P

R e s p o s t a H T T P

www.k19.com.br www.k19.com.br www.k19.com.br

Cursos Artigos Apostilas

Figura 5.1: Necessidades de uma aplicação web

Solução

Resolver os três problemas apresentados tomaria boa parte do tempo de desenvolvimento, alémde exigir conhecimentos técnicos extremamente especícos por parte dos desenvolvedores. Parafacilitar o desenvolvimento de aplicações web, a plataforma .NET soluciona esses problemas funda-mentais.

A plataforma .NET oferece os seguintes recursos fundamentais para o desenvolvimento de apli-cações web:

• Envio e recebimento de mensagens HTTP.

• Acesso simultâneo das aplicações por vários usuários de uma maneira eciente.

• Geração dinâmica das páginas das aplicações.

ASP.NET MVC

Atualmente, o ASP.NET MVC é o framework para desenvolvimento de aplicações web na pla-taforma .NET em maior ascensão. A documentação desse framework pode ser obtida em http://www.asp.net/mvc . O ASP.NET MVC é fortemente baseado nos padrões MVC e Front Controller .

MVC e Front Controller

O MVC (model-view-controller ) é um padrão de arquitetura que tem por objetivo isolar a lógicade negócio da lógica de apresentação de uma aplicação.

Esse padrão (ou alguma variação) é amplamente adotado nas principais plataformas de desen-volvimento atuais. Em particular, ele é bastante utilizado no desenvolvimento de aplicações web.

80 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 91/244

81 V ISÃO GERAL DO ASP.NET MVC

O padrão MVC divide umaaplicação em três tipos de componentes: modelo, visão e controlador.

Modelo: encapsula os dados e as funcionalidades da aplicação.

Visão: é responsável pela exibição de informações, cujos dados são obtidos do modelo.

Controlador: recebe as requisições do usuário e aciona o modelo e/ou a visão.

Para mais detalhes sobre o padrão MVC, uma boa referência é o livro Pattern-Oriented Software Architecture Volume 1: A System of Patterns (editora Wiley, 1996) dos autores Frank Buschmann, Re-gine Meunier, Hans Rohnert, Peter Sommerlad, Michael Stal e Michael Stal.

No padrão Front Controller , todas as requisições do usuário são recebidas pelo mesmo compo-nente. Dessa forma, tarefas que devem ser realizadas em todas as requisições podem ser implemen-tadas por esse componente. Isso evita a repetição de código e facilita a manutenção do sistema.

Para mais informações sobre esse padrão, consulte, por exemplo, o livro Professional ASP.NET Design Patterns (editora Wrox, 720) de Scott Millett.

Visual Studio

O primeiro passo para construir uma aplicação web utilizando o framework ASP.NET MVC 4 écriar um projeto no Visual Studio a partir do modelo adequado. No nosso caso, o modelo de projetoque deve ser utilizado é o ASP.NET MVC 4 Web Application.

Figura 5.2: Criando um projeto

www.facebook.com/k19treinamentos 81

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 92/244

V ISÃO GERAL DO ASP.NET MVC 82

Devemos escolher Basic Project conforme gura abaixo:

Figura 5.3: Criando um projeto

O projeto criado já vem com diversas pastas e arquivos. Ao longo dos próximos capítulos, a fun-ção de cada pasta e de cada arquivo será discutida.

Testando a aplicação

Para vericar o funcionamento do projeto, basta executá-lo através do menu: Debug -> Start Debugging . Um servidor será inicializado na máquina e a aplicação é implantada nesse servidor. Além disso, uma janela do navegador padrão do sistema é aberta na url principal da aplicação.

Trocando a porta do servidor

Para trocar a porta do servidor inicializado pelo Visual Studio utiliza, basta alterar as proprieda-des do projeto clicando com o botão direito do mouse no projeto e escolhendo o item properties edepois a aba web .

Exemplo de uma Aplicação Web

Veremos a seguir um exemplo de uma simples aplicação web em ASP.NET MVC 4. Essa aplicaçãopossuirá 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áginaprincipal. Os controladores são denidos por classes que derivam da classe Controller . Os nomes

82 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 93/244

83 V ISÃO GERAL DO ASP.NET MVC

dos controladores devem terminar com a palavra Controller . Além disso, eles devem ser denidosna pasta Controllers da aplicação. Considere a classe K19Controller denida abaixo.

1 p u b l ic c lass K 1 9 Co n t ro l le r : Co n t ro l le r

2 {3 p r iva te s ta t ic in t N u mero D eAcessos { ge t ; se t ; }45 public ActionResult Index()6 {7 K 19 Co nt ro ll er . N um er oD eA ce ss os + +;8 Vi ew B ag . A c es s os = K 1 9C o nt r ol l er. N u m er o De A ce s so s ;9 return View() ;

1 }11 }

Código C# 5.1: K19Controller.cs

A classe K19Controller possui uma propriedade chamada NumeroDeAcessos. Essa propriedadearmazenará o número de visualizações da página principal.

Ométodo Index() seráchamadotodavezqueaurl http://<IP_SERVIDOR>:<PORTA_APP>/K19/Indexfor requisitada por um navegador. Note que essa url é formada pelo nome do controlador (nome daclasse que dene o controlador sem o suxo Controller ) seguido pelo nome do método.

Cada vez que o método Index() é chamado, o valor da propriedade NumeroDeAcessos é incre-mentado. Além disso, o valor atualizado dessa propriedade é colocado na ViewBag para que possaser acessado na camada de apresentação.

Para indicar que o uxo de execução deve seguir para a camada de apresentação, o métodoIndex() invoca o método View() e devolve a resposta obtida. Por padrão, o uxo será direcionadopara um arquivo chamado Index.cshtml que deve estar localizado na pasta Views\K19\ .

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\K19\ da aplicação com o conteúdoabaixo.

1 @{2 Vie wB ag . Ti tl e = "Index" ;3 }4 <h2 >A cesso s : @View Bag .A cesso s</ h2 >

Código CSHTML 5.1: Index.cshtml

Para acessar a ViewBag, devemos utilizar o caractere @, como no código acima.

Exercícios de Fixação

1 Crie um projeto do tipo ASP.NET MVC 4 Web Application chamado K19 no Visual Studio 2012Express for Web. Utilize o template Basic Project.

www.facebook.com/k19treinamentos 83

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 94/244

V ISÃO GERAL DO ASP.NET MVC 84

Figura 5.4: Criando um projeto

Figura 5.5: Criando um projeto

84 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 95/244

85 V ISÃO GERAL DO ASP.NET MVC

2 Crie um controlador chamado K19 no projeto K19. Siga os passos apresentados nas imagensabaixo.

Figura 5.6: Criando um controlador

Figura 5.7: Criando um controlador

1 using System;2 using System.Web.Mvc;34 namespace K19.Contro l lers5 {6 p u b lic c las s K 1 9 Co n t ro l le r : Co n t ro l ler

7 {8 public ActionResult Index()9 {

www.facebook.com/k19treinamentos 85

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 96/244

V ISÃO GERAL DO ASP.NET MVC 86

1 Random random = ne w Random() ;11 Vie wB ag . Nu me ro Da So rt e = r an do m. Ne xt () ;12 return View() ;13 }14 }

15 }

Código C# 5.2: K19Controller.cs

3 Dentro da pasta Views, crie uma pasta chamada K19.

Figura 5.8: Criando uma pasta

4 Crie uma página na aplicação, adicionando um arquivo chamadoIndex.cshtml dentro da pasta Views\K19\.

86 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 97/244

87 V ISÃO GERAL DO ASP.NET MVC

Figura 5.9: Adicionando uma tela

Figura 5.10: Adicionando uma tela

www.facebook.com/k19treinamentos 87

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 98/244

V ISÃO GERAL DO ASP.NET MVC 88

1 @{2 Vie wB ag . Ti tl e = "Index" ;3 }4 <h2 >O lá! O seu n ú mero d a so r te é @View Bag .N u mero D aSo r te< / h2 >

Código CSHTML 5.2: Index.cshtml

5 Para visualizar a página, basta executar o projeto no Visual Studio e acessar o endereço

http://localhost:<PORTA_APP>/K19/Index

Figura 5.11: Acessando a página da aplicação

Integração com Entity Framework

A integração entre Entity Framework e ASP.NET MVC 4 é realizada de maneira extremamentesimples. No Visual Studio 2012, ao criar um projeto ASP.NET MVC 4 do tipo Basic , a biblioteca doEntity Framework 5 é adicionada automaticamente.

As conguraçõespadrões do Entity Frameworkpodem ser alteradas através do arquivo Web.cong .

Por m, bastaria implementar as entidades e mapeá-las como visto no Capítulo 4.

Scaffold

O Visual Studio 2012 é 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 4. Os controla-dores gerados podem utilizar as funcionalidades do Entity Framework para interagir como banco dedados.

88 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 99/244

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 100/244

V ISÃO GERAL DO ASP.NET MVC 90

Figura 5.13: Gerando o scaffold

Figura 5.14: Gerando o scaffold

90 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 101/244

91 V ISÃO GERAL DO ASP.NET MVC

Figura 5.15: Scaffold gerado

9 Para testar, acesse o endereço http://localhost:<PORTA_APP>/Editora/Index .

10 Adicione uma entidade chamada Livro na pasta Models.1 namespace K19.Models2 {3 p u b lic c las s Livro4 {5 p u b lic in t L iv ro ID { ge t ; se t ; }67 public s tr ing Ti tulo { ge t ; se t ; }89 public double P reco { ge t ; se t ; }

111 p u b lic in t Ed i to ra ID { ge t ; se t ; }1213 public v ir tual Ed i to r a Ed i to r a { ge t ; se t ; }14 }15 }

Código C# 5.5: Livro.cs

11 Altere a classe K19Context para registrar a entidade Livro .

1 namespace K19.Models2 {3 p u b lic c lass K 1 9 Co ntex t : D b Con tex t4 {5 public DbSet<Editora > Editoras { ge t ; se t ; }6

7 public D b Se t<Liv ro > L iv ro s { ge t ; se t ; }8 }9 }

www.facebook.com/k19treinamentos 91

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 102/244

V ISÃO GERAL DO ASP.NET MVC 92

Código C# 5.6: Livro.cs

12 Faça novamente o build do projeto. Depois, gere o scaffold da entidade Livro . Crie um contro-lador chamado Livro seguindo os passos apresentados nas imagens a seguir.

13 Para testar, acesse o endereço http://localhost:<PORTA_APP>/Livro/Index .

Apague a base de dados K19.Models.K19Context antes de testar a aplicação

92 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 103/244

C AMADA DE A PRESENTAÇÃO

C A P

Í T U L O

6 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 denidos na camada de modelo. A camada de controle re-cupera os dados da camada de modelo e os envia para a camada de apresentação. Basicamente, acamada de apresentação denirá como esses dados serão apresentados para os usuários da aplica-ção.

O uxo inverso também ocorre. Ou seja, a camada de apresentação obtém dados inseridos pelosusuários e os envia paraa camadade controle que,por sua vez, usa esses dados paraalterar a camadade modelo.

Neste capítulo, mostraremos como a camada de apresentação de uma aplicação web é cons-truída com a utilização de recursos do ASP.NET MVC como Inline Code , HTML Helper , Layout e Par-tial Views .

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 Razorpara construir essas telas. A principal característica da Razor é ser concisa e simples, diminuindo onúmero de caracteres e as tradicionais tags de scripts do ASP.NET MVC (<% %>).

Nos exemplos abaixo, mostraremos algumas diferença entre Razor e ASPX.

Criando Variáveis

TodaexpressãoemRazor começacomo caractere@. Paracriarmos variáveis,precisamos declará-las dentro de um bloco Razor:

1 @{2 s tring nome = "K19";3 s tr in g t el ef on eD aK 19 = "2387-3791" ;4 s tr in g e nd er ec oD aK 19 = "Av. Br ig ad e iro Far ia L ima" ;5 in t nu me ro Da K1 9 = 1 57 1;6 }

Código CSHTML 6.1: Criando variáveis em Razor

1 <%2 string n o me = "K19";3 string te le fo n eD aK 1 9 = "2387-3791" ;4 string en d erecoD aK 1 9 = "Av. Br ig ad e iro Far ia L ima" ;5 in t nu me ro Da K1 9 = 1 57 1;6 %>

Código ASPX 6.1: Criando variáveis em ASPX

www.facebook.com/k19treinamentos 93

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 104/244

C AMADA DE A PRESENTAÇÃO 94

Acessando variáveis

As variáveis podem ser facilmente acessadas.

1 <p >Tele fo n e d a K 1 9 : @te lefo n eDaK 1 9 </ p >

Código CSHTML 6.2: Acessando uma variável

1 <p >Tele fo n e d a K 1 9 : <%= te le fo n eD aK 1 9 % ></ p >

Código ASPX 6.2: Acessando uma variável

Condicionais (if e else)

Podemos utilizar os comandos de controle de uxo if e else . Veja os exemplos abaixo.

1 @if (n umero == n u mero D aK 19 )2 {3 <p >Ch ego u n a K 1 9 !</p >4 }5 e ls e6 {7 <p >Co n tin u e an d an d o .< / p >8 }9 <! - - o u - - >

1 @ {11 in t n um er o = 46 3;12 i f( n um er o == n um er oD aK 19 )13 {14 <p >Ch ego u n a K 1 9 !</p >15 }16 else17 {18 <p >Co n t in u e an d an d o .< / p >19 }2 }

Código CSHTML 6.3: Utilizando if e else em Razor

1 <%2 i f (n u mero == n u mero D aK 19 )3 {4 %>5 <p >Ch ego u n a K 1 9 !</p >6 <%7 }

8 e ls e9 {1 % >11 <p >Co n tin u e an d an d o .< / p >12 < %13 }14 % >

Código CSHTML 6.4: Utilizando if e else em ASPX

Laços

Podemos criar laços utilizando o comando for .

1 @ fo r( in t i = ; i < 5 ; i ++ )2 {

94 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 105/244

95 C AMADA DE A PRESENTAÇÃO

3 <p > i = @ i < / p >4 }

Código CSHTML 6.5: Criando um laço em Razor

1 <%2 fo r ( in t i = ; i < 5; i ++ )3 {4 %>5 <p > i = < % = i % > < /p >6 <%7 }8 %>

Código ASPX 6.3: Criando um laço em ASPX

Texto e código1 @ if ( x = = "nome")2 {3 @ : O no me d a e di to ra é @ e di to ra . N om e4 }

Código CSHTML 6.6: Texto e código em Razor

1 <%2 if ( x = = "nome")3 {4 %>5 O n om e da e d it or a é < %= e d it or a. No me % >

6 <%7 }8 %>

Código ASPX 6.4: Texto e código em ASPX

Comentários

Podemos adicionar comentários nas páginas.

1 @ * C o m e nt á ri o * @

Código CSHTML 6.7: Comentários em Razor

1 <%- - Co men tá r io - - %>

Código ASPX 6.5: Comentários em ASPX

Exercícios de Fixação

1 Crie um projeto do tipo ASP.NET MVC 4 Web Application chamado CamadaDeApresentacaono Visual Studio 2012 Express for Web . Utilize o template Basic Project.

www.facebook.com/k19treinamentos 95

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 106/244

C AMADA DE A PRESENTAÇÃO 96

2 Adicione um controlador chamado Home no projeto CamadaDeApresentacao utilizandoo tem-plate Empty MVC Controller. Nesse controlador, dena uma ação chamada Index .

1 namespace CamadaDeApresentacao .Contro l lers

2 {3 p u b lic c las s H o meCo n tro l le r : Co n tro l ler4 {5 public ActionResult Index()6 {7 Random random = ne w Random() ;8 Vie wB ag . Nu me ro Da So rt e = r an do m. Ne xt () ;9 return View() ;

1 }11 }12 }

Código C# 6.1: Home.cs

3 Adicione uma página associada à açãoIndex do controlador Home do projeto CamadaDeApre-sentacao .

1 @{2 Vie wB ag . Ti tl e = "Index" ;3 }45 @ fo r( in t i = ; i < 1 ; i ++ )6 {7 <h2 >O lá! O seu n ú mero d a so r te é @View Bag .N u mero D aSor te< / h2 >8 }

Código CSHTML 6.8: Index.cshtml

Para ver o resultado, acesse a url http://localhost:<PORTA_APP>/Home/Index .

4 Altere o arquivo Index.cshtml do exercício anterior para imprimir uma mensagem a partir deuma variável.

1 @{2 Vie wB ag . Ti tl e = "Index" ;3 st ri ng me nsa ge m = " Ol á ! O s eu n úm er o d a s o rt e é " + @View Bag .N u mero D aSor te ;4 }56 @ fo r( in t i = ; i < 1 ; i ++ )7 {8 < h2 > @m en sa ge m </h2 >9 }

Código CSHTML 6.9: Index.cshtml

Para ver o resultado, acesse a url http://localhost:<PORTA_APP>/Home/Index .

Exercícios Complementares

1 Altere o arquivo Index.cshtml para gerar a seguinte tela para o usuário:

96 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 107/244

97 C AMADA DE A PRESENTAÇÃO

Figura 6.1: Inline Code

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 denir umachave para esse item. Vejao código abaixo.

1 ViewBag .H o raDo Servid o r = D a teTime .N ow.To Sh o r tTimeS t rin g ( ) ;

Código C# 6.2: Adicionando um item na ViewBag

No código acima, criamos uma chave chamada HoraDoServidor e atribuímos um valor a essachave.

Na camada de apresentação, os itens armazenados na ViewBag podem ser acessados facilmenteatravés da sintaxe da Razor. Veja um exemplo abaixo.

1 A h or a d o s e rv i do r é @ Vie w Ba g . H o ra D oS e rv i do r

Código CSHTML 6.11: Acessando um item da ViewBag

A ViewBagoferece uma forma simples de transmitir dados da camada de controle para a camadade apresentação, mas apresenta algumas desvantagens. Por exemplo, como as chaves são adicio-nadas dinamicamente, não é possível garantir a existência dessas chaves em tempo de compilação.Considere o código abaixo.

www.facebook.com/k19treinamentos 97

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 108/244

C AMADA DE A PRESENTAÇÃO 98

1 double n u mero = ne w Random() .NextDouble( ) ;2 if ( n u me ro < .5 )3 {4 ViewBag .X = "K 1 9 TREINA MEN TO S";

5 }6 else7 {8 V ie wB ag .X = 1 ;9 }

Código C# 6.3: Adcicionando chaves dinamicamente na ViewBag

No código acima, o tipo do objeto associado à chave X depende do valor da variável numero,que é gerado aleatoriamente. Quando o valor gerado for menor do que 0.5, o tipo desse objeto serástring . Caso contrário, o tipo desse objetoserá int . Suponha que a chave Xsejautilizadana camadade apresentação.

1 <p >@ViewBag.X.Lower( )</ p >

Código CSHTML 6.12: Utilizando a chave X ViewBag

O códigoacima não produz erros de compilação. Contudo, na execução, um erro poderá ocorrer.O problema é que esse código supõe que o objeto associado à chave X possui o método Lower() . Noentanto, se a ação for acionada um número suciente de vezes, em algum momento isso não seráverdade, e um erro de execução ocorrerá.

Além disso, recursos do Visual Studio como IntelliSense (recurso para completar código) ou refa-toração não podem ser aplicados com o uso da ViewBag.

Uma alternativa à utilização da ViewBag é o recurso strongly typed views. Com esse recursopodemos xar, emtempo de compilação, o tipodo objetoqueserá transferido da camadade controlepara a camada de apresentação. Uma vez que o tipo desse objeto foi xado, o compilador é capazde vericar a validade do código, evitando eventuais erros de execução. Além disso, o Visual Studiopode auxiliar o desenvolvimento da aplicação com os recursos de IntelliSense e de refatoração.

Para utilizar strongly type views , o primeiro passo é, na camada de controle, passar como parâ-metro para o método View() um objeto do tipo esperado pela camada de apresentação.

1 public ActionResult Acao()2 {3 E di to ra e di to ra = ne w E d it o ra { N om e = "K19", E m a i l = "[email protected]" };4 return View(editora) ;5 }

Código C# 6.4: Passando um objeto para a camada de apresentação

Para denir o tipo do objeto esperado na camada de apresentação, podemos utilizar a sintaxe daRazor. Veja o código abaixo.

1 @mo del K 1 9 .Mod e ls .Ed ito r a

Código CSHTML 6.13: Denindo o tipo do objeto esperado na camada de apresentação

Podemos também utilizar o comando using para evitar a escrita dos nomes completos das clas-ses.

98 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 109/244

99 C AMADA DE A PRESENTAÇÃO

1 @u s in g K 1 9 .Mod e ls2 @mo del Ed i to r a

Código CSHTML 6.14: Utilizando o comando using

Para acessar o objeto transmitido da camada de controle para a camada de apresentação, deve-mos utilizar a propriedade Model. Observe o código a seguir.

1 @u s in g K 1 9 .Mod e ls2 @mo del Ed i to r a34 <p >5 N o me: @Mo d el .N o me6 <br />7 Emai l : @Mo del .Email8 </ p >

Código CSHTML 6.15: Utilizando a propriedade Model

Se tentarmos acessar um método ou propriedade inexistentes, um erro de compilação ocorrerá,pois agora o compilador conhece o tipo do objeto transmitido. Dessa forma, o código abaixo produzum erro de compilação.

1 @u s in g K 1 9 .Mod e ls2 @mo del Ed i to r a34 <p >5 N o me: @Mo d el .N o me6 <br />7 Te lefo n e : @Mo del .Te le fo n e

8 </ p >

Código CSHTML 6.16: Produzindo um erro de compilação

Observe que apenas um objeto pode ser transmitido da camada de controle para a camada deapresentação através do recurso strongly type views . Já com a utilização deViewBag, diversos objetospodem ser transmitidos. Note também que os dois recursos podem ser utilizados ao mesmo tempo.

Exercícios de Fixação

5 No projeto CamadaDeApresentacao , adicione um controlador chamado Relogio utilizanto otemplate Empty MVC Controller. Nesse controlador, dena uma ação chamada Agora . Essa açãodeve armazenar a data e o horário atual na ViewBag.

1 namespace CamadaDeApresentacao .Contro l lers2 {3 p u b lic c las s Re lo g io Co nt ro l le r : Co n t ro l ler4 {5 public ActionResult Agora( )6 {7 V ie wB ag . Ago ra = D at eTi me . Now .ToS tri ng ( "d d /MM/yy y y H H :mm:ss") ;8 return View() ;

9 }1 }11 }

www.facebook.com/k19treinamentos 99

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 110/244

C AMADA DE A PRESENTAÇÃO 100

Código C# 6.5: RelogioController.cs

6 Adicione uma página associada à ação Agora do controlador Relogio.

1 @{2 ViewBag .Title = "Agora" ;3 }45 <h2 >A g o ra : @View Bag .A g ora</ h2 >

Código HTML 6.1: Agora.cshtml

Para testar, acesse: http://localhost:<PORTA_APP>/Relogio/Agora .

7 Adicione uma entidade chamada Aluno na pasta Models do projeto CamadaDeApresentacao .

1 namespace CamadaDeApresentacao .Models2 {3 p u b lic c las s Aluno4 {5 p u b lic in t A lu no ID { ge t ; se t ; }67 public s tr ing N o me { ge t ; se t ; }89 public s tr ing Emai l { ge t ; se t ; }

1 }11 }

Código C# 6.6: Aluno.cs

8 Adicione um controlador chamado Aluno utilizando o template Empty MVC Controller. Nessecontrolador, dena uma ação para transmitir para camada de apresentação um objeto da entidade Aluno. Utilize strongly type views .

1 namespace CamadaDeApresentacao .Contro l lers2 {3 p u b lic c las s A lu n o Co n tro l le r : Co n tro l ler4 {5 public ActionResult Detalhes( )6 {7 Aluno a = ne w A l un o {8 AlunoID = 1 ,9 Nome = " Jo n as H i r ata" ,

1 Email = " [email protected]"11 };12 return View(a) ;13 }14 }15 }

Código C# 6.7: AlunoController.cs

9 Adicione uma tela associada à ação Detalhes do controlador Aluno com o seguinte conteúdo.

1 @mo del Camad aD eA p resen tacao .Mo d e ls .A lu n o

100 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 111/244

101 C AMADA DE A PRESENTAÇÃO

23 @{4 ViewBag .Title = "Detalhes" ;5 }6

7 <h2 >Detalhes</ h2 >89 <p >

1 A lu no ID : @ Mo de l. Al un oI D11 < / p >1213 <p >14 Nome : @ Mod el .Nome15 < / p >1617 <p >18 Emai l: @ Mod el . Emai l19 < / p >

Código HTML 6.2: Detalhes.cshtml

Para ver o resultado, acesse a urlhttp://localhost:<PORTA_APP>/Aluno/Detalhes .

10 Adicione uma ação no controlador Aluno.

1 ...2 public ActionResult Lis ta( )3 {4 I C ol l ec t io n < A lu no > l i s ta = ne w List< Aluno >();56 fo r ( in t i = ; i < 5 ; i + + )7 {8 Aluno a = ne w A lun o {

9 AlunoID = i ,1 Nome = " A l un o " + i ,11 Email = " E m ai l " + i12 };13 lista .Add (a) ;14 }1516 return View(lis ta) ;17 }18 ...

Código C# 6.8: AlunoController.cs

11 Adicione uma tela associada à ação Lista do controlador Aluno com o seguinte conteúdo.1 @mo del ICo l lec t ion <Camad aD eAp resentacao .Mo de ls .A lun o >23 @{4 ViewBag .Title = "Lis ta" ;5 }67 <h2 >Tab ela d e A lu no </ h2 >89 <table >

1 < tr >11 <th >AlunoID</ th >12 <th >Nome</th >13 <th >Email</ th >

14 </ tr >1516 @f ore ac h ( var a in @ Mod el )

www.facebook.com/k19treinamentos 101

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 112/244

C AMADA DE A PRESENTAÇÃO 102

17 {18 <tr >19 <td >@a.AlunoID</ td >2 < td >@a.Nome</td >21 <td >@a.Email</ td >

22 </ tr >23 }24 < / table >

Código HTML 6.3: Lista.cshtml

Para ver o resultado, acesse a url http://localhost:<PORTA_APP>/Aluno/Lista .

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# (ou outralinguagem de programação suportada pelo .NET). Essa mistura pode prejudicar a legibilidade docódigo em alguns casos. Além disso, a manutenção da aplicação pode se tornar mais complexa.

Considere a criação de um link utilizando diretamente as tags HTML.

1 <a h re f ="/Editora/Index/" >Lis ta d e ed i to r as< / a >

Código CSHTML 6.17: Link para a lista de editoras

Seoformatodaurlparaacessaraação Index do controlador Editora foralterado, o códigoacima

deverá ser modicado. Veremos como o formato das urls pode ser congurado no Capítulo ??.Para facilitar a manutenção do código das páginas CSHTML, o ASP.NET MVC oferece os chama-

dos HTML Helpers. A função de um HTML Helper é encapsular um código XHTML. Por exemplo,para adicionar um link, podemos usar o método ActionLink do objeto Html, ao invés de usar a tag<a> do HTML diretamente. No código abaixo, criamos um link para a ação responsável por listar aseditoras.

1 @H tml .A c t io nLin k ( "Lis ta d e ed i to r as" , "Index" , "Editora" )

Código CSHTML 6.18: Criando um link para a listagem de editoras

Agora, se o formato da url para acessar a ação Index do controlador Editora for alterado, o có-digo acima não precisa ser alterado.

ActionLink Helper

O helper ActionLink é utilizado para gerar os links das páginas de uma aplicação web. Essehelper pode ser utilizado de diversas maneiras. A forma mais simples de utilizá-lo é passar a eledois parâmetros: o texto e a ação associados ao link desejado. Nesse caso, o link gerado pelo helperActionLink estará associado ao controlador correspondente a página na qual o link foi inserido.

1 @H tml .A c t io nLin k ( " T EX TO PAR A O U S UÁ R IO ", "ACTION" )

Código CSHTML 6.19: Criando um link com controlador implícito

102 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 113/244

103 C AMADA DE A PRESENTAÇÃO

Podemos denir o controlador desejado explicitamente. Para isso, é necessário passar um ter-ceiro parâmetro para o método ActionLink .

1 @H tml .A c t io nLin k ( " T EX TO PAR A O U S UÁ R IO ", "ACTION", "CONTROLADOR" )

Código CSHTML 6.20: Criando um link com controlador explícito

O helper ActionLink permite que parâmetros sejam adicionados nos links gerados. Para isso, énecessário passar um array como parâmetro.

1 @H tml .A c t io nLin k ( " T EX TO PAR A O U S UÁ R IO ", "ACTION", n e w { I n i c i o = , F i n a l = 1 } )

Código CSHTML 6.21: Acrescenta parâmetros de url

BeginForm e EndForm Helpers

No ASP.NET MVC, há um conjunto de HTML Helpers para facilitar a criação de formulários naspáginas de uma aplicação web.

Para criar um formulário, utilizamos o helper BeginForm. Para terminar um formulário, utiliza-mos o helper EndForm. Veja o exemplo a seguir.

1 @{H tml .Beg in Fo rm( ) ;}23 <! - - e lemen tos d o fo rmu lá r io - - >45 @{H tml .En d Fo rm( ) ;}

Código CSHTML 6.22: Utilizando os helpers BeginForm e EndForm

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. Observe o formulário abaixo.

1 @u s in g (H tml .Begin Form( ) ) {23 <! - - e lemen tos d e fo rmu lá r io - - >45 }

Código CSHTML 6.23: Utilizando o comando using

Por padrão, um formulário criado com o helper BeginForm enviará requisições à ação associadaà url atual. Contudo, podemos denir explicitamente umaoutra ação para receber essas requisições. Veja um exemplo no código abaixo.

1 @u s in g (H tml .Begin Form( "ACTION", "CONTROLADOR")) {23 <! - - e lemen tos d e fo rmu lá r io - - >45 }

Código CSHTML 6.24: Denindo uma ação e um controlador explicitamente

Por padrão, os formulários gerados pelo helper BeginForm fazem requisições do tipoPOST. Nessecaso, as ações associadas a esses formulários devem ser anotadas com HttpPost para indicar o tipode requisição HTTP esperado.

www.facebook.com/k19treinamentos 103

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 114/244

C AMADA DE A PRESENTAÇÃO 104

1 p u b l ic c lass K 1 9 Co n t ro l le r : Co n t ro l le r2 {3 / / PO ST: /K 1 9 /H ome4 [ Ht tp Po st ]

5 public ActionResult Home()6 {7 ...8 return View() ;9 }

1 }

Código C# 6.9: Anotando uma ação com HttpPost

CheckBox

Podemos adicionar um checkbox em um formulário através do helper CheckBox.

1 @H tml .Ch eckBo x ("Aceito" , f a ls e )

Código CSHTML 6.25: Utilizando o helper CheckBox

O código acima produz o seguinte trecho de código HTML:

1 <in p ut id ="Aceito" name="Aceito" type ="checkbox" value ="true" />2 <in p ut n ame ="Aceito" type ="hidden" value ="false" />

Código HTML 6.4: HTML gerado pelo helper CheckBox

Considere o formulário a seguir:

1 @u s in g (H tml .Begin Form( "Cadastra" , "Contrato" ) )2 {3 @ Ht ml . C he ck Bo x ("Aceito" , f al s e )4 <in p ut ty pe ="submit" value ="Cad as tr a Co n tr a to " />5 }

Código CSHTML 6.26: Formulário

Agora, considere a ação associada ao formulário criado no código acima.

1 p u b l ic c lass Co n t r a to Con t ro l le r : Co n t ro l le r2 {3 / / POST: /Con t r ato /Cad as tr a

4 [ Ht tp Po st ]5 public A c t ion Resul t Cad as t r a (Co n tr a to co n tr a to )6 {7 ...8 return View() ;9 }

1 }

Código C# 6.10: Ação

O valor enviado através do checkbox inserido no formulário será armazenado na propriedadeAceito docontratoenviadocomoparâmetroparaaação Cadastra() . Dessa forma,a classeContratodeve possuir uma propriedade booleana chamada Aceito .

1 p u b l ic c lass Contrato2 {

104 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 115/244

105 C AMADA DE A PRESENTAÇÃO

3 public Bo o lean A ce ito { ge t ; se t ; }4 }

Código C# 6.11: Contrato.cs

TextBox

Uma caixa de texto pode ser adicionada através do helper TextBox .

1 @H tml .Tex tBo x ( "Nome", " D i gi t e o s eu n om e " )

Código CSHTML 6.27: Utilizando o helper TextBox

O código acima produz o seguinte trecho de código HTML:

1 <in p ut id ="Nome" name="Nome" type ="tex t" value =" D i gi t e o s eu n om e " />

Código HTML 6.5: HTML gerado pelo helper TextBox

TextArea

Uma caixa para textos maiores pode ser adicionada através do helper TextArea .

1 @H tml .Tex tArea( "Mensagem", "D ig ite u ma men sag em" )

Código CSHTML 6.28: Utilizando o helper TextArea

O código acima produz o seguinte trecho de código HTML:

1 <tex tar ea co ls ="2 " id ="Mensagem" name="Mensagem" rows ="2" >D ig ite u ma men sag em</ ←

tex tarea >

Código HTML 6.6: HTML gerado pelo helper TextArea

RadioButton

Um botão do tipo radio pode ser adicionado através do helper RadioButton .

1 @H tml .Rad io Bu t to n ( "CidadeNatal" , "São Pau lo " , t ru e )2 @H tml .Rad io Bu t to n ( "CidadeNatal" , "Natal" , f a ls e )3 @H tml .Rad io Bu t to n ( "CidadeNatal" , "Piracicaba" , f al se )

Código CSHTML 6.29: Utilizando o helper RadioButton

O código acima produz o seguinte trecho de código HTML:

1 <input checked ="checked" id ="CidadeNatal" name="CidadeNatal" type ="radio" value ="São ←

Paulo" />2 <in p ut id ="CidadeNatal" name="CidadeNatal" type ="radio" value ="Natal" />3 <in p ut id ="CidadeNatal" name="CidadeNatal" type ="radio" value ="Piracicaba" />

Código HTML 6.7: HTML gerado pelo helper RadioButton

www.facebook.com/k19treinamentos 105

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 116/244

C AMADA DE A PRESENTAÇÃO 106

Hidden

Um campo escondido pode ser adicionado através do helper Hidden.

1 @H tml .H id d en ( "Id" , 1)

Código CSHTML 6.30: Utilizando o helper Hidden

O código acima produz o seguinte trecho de código HTML:

1 <in p ut id ="Id" name="Id" type ="hidden" value ="1" />

Código HTML 6.8: HTML gerado pelo helper Hidden

Password

Uma caixa para senha pode ser adicionada através do helper Password .

1 @H tml .Passwo rd ( "Password" , "senha" )

Código CSHTML 6.31: Utilizando o helper Password

O código acima produz o seguinte trecho de código HTML:

1 <in p ut id ="Password" name="Password" type ="password" value ="senha" />

Código HTML 6.9: HTML gerado pelo helper Password

Mais SobreOs dados preenchidos nos elementos de um formulário são recuperados da ViewBag.Considere o código abaixo:

1 @H tml .Tex tBo x ( "Nome")

Código CSHTML 6.32: Utilizando o helper TextBox

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 aseguir.

1 @H tml .Tex tBo x ( "Nome", "NomeInicial" )

Código CSHTML 6.33: Utilizando o helper TextBox

Strongly Typed Helpers

Se os HTML Helpers forem utilizados de maneira análoga à mostrada anteriormente, a probabi-lidade de ocorrer um erro de digitação é alta. A forma que os HTML Helpers foram aplicados nãopermite que o compilador verique a existência das propriedades associadas aos elementos dos for-mulários. Por exemplo, considere o código a seguir.

106 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 117/244

107 C AMADA DE A PRESENTAÇÃO

1 @H tml .Ch eckBo x ("Aceito" , f a ls e )

Código CSHTML 6.34: Utilizando o helper CheckBox

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 podenão existir. Contudo, nenhum erro de compilação seria gerado nesse caso.

Para evitar esse tipo de problema, podemos utilizar a seguinte sintaxe em telas fortemente tipa-das:

1 @mo del K 1 9 .Mod e ls .Co nt r a to2 ...3 @H tml .Ch eck Bo x Fo r ( c => c .A ce ito )4 ...

Código CSHTML 6.35: Utilizando o helper CheckBoxFor

Com essa sintaxe, o compilador tem condições de vericar a existência das propriedades. Sendoassim, ele produzirá um erro de compilação se uma propriedade inexistente for utilizada.

TextBoxFor

1 @mo del K 1 9 .Mod e ls .Empresa2 ...3 @H tml .Tex tBox Fo r (x => x .N o me)4 ...

Código CSHTML 6.36: Utilizando o helper TextBoxFor

O código acima produz o seguinte trecho de código HTML:

1 <in p ut id ="Nome" name="Nome" type ="tex t" value ="K 1 9 Tre inamen to s" />

Código HTML 6.10: HTML gerado pelo helper TextBoxFor

TextAreaFor

1 @mo del K 1 9 .Mod e ls .Empresa2 ...3 @H tml .Tex tA reaFo r (x => x .D escricao )4 ...

Código CSHTML 6.37: Utilizando o helper TextAreaFor

O código acima produz o seguinte trecho de código HTML:

1 <tex tar ea co ls ="2 " id ="Descr icao" name="Descr icao" rows ="2" >2 K1 9 T re in am en to s em J av a e . NE T3 </ tex tarea >

Código HTML 6.11: HTML gerado pelo helper TextAreaFor

RadioButtonFor

www.facebook.com/k19treinamentos 107

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 118/244

C AMADA DE A PRESENTAÇÃO 108

1 @mo del K 1 9 .Mod e ls .Pesso a2 ...3 @H tml .Rad io But to n For (x => x .Cid ad eN ata l , "São Pau lo " )4 @H tml .Rad io But to n For (x => x .Cid ad eN ata l , "Natal" )

5 @H tml .Rad io But to n For (x => x .Cid ad eN ata l , "Piracicaba" )6 ...

Código CSHTML 6.38: Utilizando o helper RadioButtonFor

O código acima produz o seguinte trecho de código HTML:

1 <input checked ="checked" id ="CidadeNatal" name="CidadeNatal" type ="radio" value ="São ←

Paulo" />2 <in p ut id ="CidadeNatal" name="CidadeNatal" type ="radio" value ="Natal" />3 <in p ut id ="CidadeNatal" name="CidadeNatal" type ="radio" value ="Piracicaba" />

Código HTML 6.12: HTML gerado pelo helper RadioButtonFor

HiddenFor1 @mo del K 1 9 .Mod e ls .Empresa2 ...3 @ Ht m l . Hi d de n Fo r ( e = > e . Id )4 ...

Código CSHTML 6.39: Utilizando o helper HiddenFor

O código acima produz o seguinte trecho de código HTML:

1 <in p ut id ="Id" name="Id" type ="hidden" value ="1" />

Código HTML 6.13: HTML gerado pelo helper HiddenFor

PasswordFor1 @mo del K 1 9 .Mod e ls .U suar io2 ...3 @H tml .Passw ord Fo r (x => x .Sen h a)4 ...

Código CSHTML 6.40: Utilizando o helper PasswordFor

O código acima produz o seguinte trecho de código HTML:

1 <in p ut id ="Senha" name="Senha" type ="password" / >

Código HTML 6.14: HTML gerado pelo helper PasswordFor

Mais SobreOs dados preenchidos nos elementos de um formulário de uma tela fortemente tipadasão recuperados da propriedade Model. Considere o código abaixo:

1 @mo del K 1 9 .Mod e ls .Pesso a2 ...3 @H tml .Tex tBox Fo r (x => x .N o me)4 ...

108 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 119/244

109 C AMADA DE A PRESENTAÇÃO

Código CSHTML 6.41: Utilizando o helper TextBoxFor

Caso exista a propriedade Model.Nome, o valor inicial dessa caixa de texto será o valor dessapropriedade.

DropDownList Helper

Considere uma aplicação para cadastrar livros de uma biblioteca. Quando um livro é cadastro,o usuário podem escolher a editora desse livro. A editora pode ser selecionada através de um drop down list . Para criar um drop down list, podemos utilizar o HTML Helper DropDownList.cshtml

O primeiro passo para utilizar o helper DropDownList é criar uma SelectList na camada decontrole com as opções que o usuário poderá selecionar.

1 p u b l ic c lass L iv ro Co n tro l ler : Co n t ro l ler2 {3 public ActionResult Create( )4 {5 L is t < E di to ra > e di t or a s = e di t or a Re p os i to r y. B us c aTo da s ( ) ;6 ViewBag .Editoras = ne w Se lectList (editoras , "Id" , "Nome") ;7 return View() ;8 }9 }

Código C# 6.12: LivroController.cs

O segundo passo é adicionar o helper DropDownList na camada de apresentação.

1 @H tml .D ro p D ow n List ("Editoras" )

Código CSHTML 6.42: Utilizando o helper DropDownList

EditorFor

Considere a seguinte entidade.

1 p u b l ic c lass Editora2 {3 p u b lic in t Id { ge t ; se t ; }

4 p u b lic s t r in g N o me { ge t ; se t ; }5 p u b lic s t r in g E m ai l { ge t ; se t ; }6 p u b lic b o ol I sA tiv o { ge t ; se t ; }7 p u b lic s t r in g D escr icao { ge t ; se t ; }8 p u b lic v i r tu a l ICollect ion <Livro> Livros { ge t ; se t ; }9 }

Código C# 6.13: Editora.cs

Para editar os dados de uma editora, temos uma página conforme o exemplo abaixo:

1 @mo del K 1 9 .Mod e ls .Ed ito r a23 @{

4 Vie wB ag . Ti tl e = "Ed ição d e Ed i to r a" ;5 }6

www.facebook.com/k19treinamentos 109

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 120/244

C AMADA DE A PRESENTAÇÃO 110

7 <h2 >Ed ição d e Ed i to r a</ h2 >89 @u s in g (H tml .Beg in Fo rm( ) ) {

1 @ H tm l . H id d en F or ( m o de l = > m od e l .I d )11

12 @ H tm l . L ab e lF o r ( mo de l = > mo de l . N om e )13 @ H tm l . Tex t Bo x Fo r ( m od e l = > mo d el . N om e )1415 <br />1617 @ H tm l . L ab e lF o r ( mo de l => m od e l . Em a il )18 @ H tm l . Tex t Bo x Fo r ( m od e l = > mo d el . E m ai l )192 < br />2122 @ H tm l . L ab e lF o r ( mo de l = > mo de l . D es c ri c ao )23 @ H tm l . Tex t Ar e aF o r ( mo de l = > m od el . D e sc r ic a o )2425 <br />2627 @ H tm l . L ab e lF o r ( mo de l => m od e l . Is A ti v o )28 @ H tm l . C he c kB o xF o r ( mo de l = > mo de l . I sA t iv o )293 < in p ut ty pe ="submit" value ="Salvar" / >31 }

Código CSHTML 6.43: Edit.cshtml

Para cada propriedade da entidade Editora , utilizamos um helper para gerar o código HTMLnecessário para a entradade dados. Por exemplo, no caso das propriedades Nomee Email , utilizamoso Helper TextBox . Para a propriedade booleana IsAtivo , utilizamos o helper CheckBox.

Observe que a escolha do helper depende 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 .Observe a utilização do helper EditorFor no código abaixo.

1 @mo del K 1 9 .Mod e ls .Ed ito r a23 @{4 Vie wB ag . Ti tl e = "Ed ição d e Ed i to r a" ;5 }67 <h2 >Ed ição d e Ed i to r a</ h2 >89 @u s in g (H tml .Beg in Fo rm( ) ) {

1 @ H tm l . H id d en F or ( m o de l = > m od e l .I d )1112 @ H tm l . L ab e lF o r ( mo de l = > mo de l . N om e )13 @ Ht m l . Ed i to r Fo r ( m od el => mo de l . N om e )1415 <br />1617 @ H tm l . L ab e lF o r ( mo de l => m od e l . Em a il )18 @ Ht m l . Ed i to r Fo r ( m od el => mo de l . E ma i l )192 < br />2122 @ H tm l . L ab e lF o r ( mo de l = > mo de l . D es c ri c ao )23 @ Ht m l . Ed i to r Fo r ( m od el = > mo de l . D es c ri c ao )2425 <br />26

27 @ H tm l . L ab e lF o r ( mo de l => m od e l . Is A ti v o )28 @ Ht m l . Ed i to r Fo r ( m od el = > m od e l . Is A ti v o )29

110 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 121/244

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 122/244

C AMADA DE A PRESENTAÇÃO 112

12 Adicione uma ação no controlador Aluno com o seguinte código.

1 ...2 public ActionResult Editar ( )3 {4 Aluno aluno = ne w Aluno5 {6 AlunoID = 1 ,7 Nome = " Jo n as H i r ata" ,8 Email = " [email protected]"9 };

1 return View(aluno) ;11 }12 ...

Código C# 6.15: AlunoController.cs

13 Adicione uma página associada à ação Editar do controlador Aluno.

1 @mo del Camad aD eA p resen tacao .Mo d e ls .A lu n o2 @{3 ViewBag .Title = "Editar" ;4 }56 <h2 >Editar</ h2 >78 <fo rm ac t io n ="/Aluno/Editar" method ="post" >9 <in p ut id ="AlunoID" name="AlunoID" type ="hidden" value ="1" />

111 <labe l f o r ="Nome">Nome</label >12 <in pu t id ="Nome" name="Nome" type ="tex t" value ="@Model.Nome" />1314 <labe l f o r ="Email" >E-mail</ label >15 <in pu t id ="Email" name="Email" type ="tex t" value ="@Model.Email" / >1617 <in pu t ty pe ="submit" value ="Salvar" />18 < / form >

Código CSHTML 6.46: Editar.cshtml

Para testar, acesse a url http://localhost:<PORTA_APP>/Aluno/Editar .

14 Altere o exercício anterior, porém utilizando HTML Helpers.

1 @mo del Camad aD eA p resen tacao .Mo d e ls .A lu n o2 @{3 ViewBag .Title = "Editar" ;4 }56 <h2 >Editar</ h2 >78 @u s in g (H tml .Begin Form( ) )9 {

1 @ Ht ml . H id de n ( "AlunoID" )11 @ Ht ml . L ab el ( "Nome")12 @ Ht ml . Tex tB ox ( "Nome")13 @ Ht ml . L ab el ( "Email" )14 @ Ht ml . Tex tB ox ( "Email" )15 <in p ut ty pe ="submit" value ="Salvar" / >16 }

Código CSHTML 6.47: Editar.cshtml

112 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 123/244

113 C AMADA DE A PRESENTAÇÃO

Para testar, acesse acesse a url http://localhost:<PORTA_APP>/Aluno/Editar .

15 Altere o exercício anterior e utilize strongly typed helpers.

1 @mo del Camad aD eA p resen tacao .Mo d e ls .A lu n o2 @{3 ViewBag .Title = "Editar" ;4 }56 <h2 >Editar</ h2 >78 @u s in g (H tml .Begin Form( ) )9 {

1 @ H tm l . H id d en F or ( x = > x . A lu n oI D )11 @ Ht ml . L ab el Fo r (x => x .N om e )12 @ H tm l . Tex t Bo x Fo r ( x = > x . N om e )13 @ H tm l . L ab e lF o r (x = > x . E ma il )14 @ H tm l . Tex t Bo x Fo r ( x = > x . E ma i l )15 <in p ut ty pe ="submit" value ="Salvar" / >16 }

Código CSHTML 6.48: Editar.cshtml

Para testar, acesse a url http://localhost:<PORTA_APP>/Aluno/Editar .

16 Altere o exercício anterior e utilize o HTML Helper EditorFor.

1 @mo del Camad aD eA p resen tacao .Mo d e ls .A lu n o2 @{3 ViewBag .Title = "Editar" ;4 }56 <h2 >Editar</ h2 >78 @u s in g (H tml .Begin Form( ) )9 {

1 @ H tm l . E di t or F or ( x = > x . A lu n oI D )11 @ Ht ml . L ab el Fo r (x => x .N om e )12 @ H tm l . E di t or F or ( x = > x . N om e )13 @ H tm l . L ab e lF o r (x = > x . E ma il )14 @ H tm l . E di t or F or ( x = > x . E ma il )15 <in p ut ty pe ="submit" value ="Salvar" / >16 }

Código HTML 6.15: Editar.cshtml

Para testar, acesse a url http://localhost:<PORTA_APP>/Aluno/Editar .

OBS: repare que o campo correspondente à propriedade AlunoID é exibido no formulário.

17 Altere a entidade Aluno para indicar que a propriedade AlunoID não deve ser exibida nos for-mulários que utilizarem o HTML Helper EditorFor e EditorForModel.

1 namespace CamadaDeApresentacao .Models2 {3 p u b lic c las s Aluno4 {

5 [ H id de nI np ut ( Di sp la yVal ue = false ) ]6 p u b lic in t A lu no ID { ge t ; se t ; }7

www.facebook.com/k19treinamentos 113

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 124/244

C AMADA DE A PRESENTAÇÃO 114

8 public s tr ing N o me { ge t ; se t ; }9

1 public s tr ing Emai l { ge t ; se t ; }11 }12 }

Código C# 6.16: Aluno.cs

Para testar, acesse a url http://localhost:<PORTA_APP>/Aluno/Editar .

OBS: repare que o campo correspondente à propriedade AlunoID não é exibido no formulário.

18 Altere o exercício anterior e utilize o HTML Helper EditorForModel.

1 @mo del Camad aD eA p resen tacao .Mo d e ls .A lu n o2 @{3 ViewBag .Title = "Editar" ;4 }56 <h2 >Editar</ h2 >78 @u s in g (H tml .Begin Form( ) )9 {

1 @ Ht ml . Ed it or Fo rM od el ()11 <in p ut ty pe ="submit" value ="Salvar" / >12 }

Código HTML 6.16: Editar.cshtml

Para testar, acesse a url http://localhost:<PORTA_APP>/Aluno/Editar .

19 Adicione umanova entidade chamada Usuario na pasta Models do projeto CamadaDeApresen-tacao .

1 namespace CamadaDeApresentacao .Models2 {3 p u b lic c las s Usuar io4 {5 [ Hi dd en In pu t( D is pl ay Va lu e = false ) ]6 p u b lic in t Id { ge t ; se t ; }78 [ Disp lay (Name = "N o me d o U su ár io " ) ]9 public s tr ing N o me { ge t ; se t ; }

111 [ D at aTyp e ( Da ta Ty pe . E ma il Ad dr es s )]12 public s tr ing Emai l { ge t ; se t ; }1314 [ D at aTyp e ( Da ta Ty pe . P as sw or d )]15 public s tr ing Senh a { ge t ; se t ; }1617 [ D a ta Typ e ( D at a Ty p e . Mu l ti l in e Te x t )]18 public s tr ing D escricao { ge t ; se t ; }192 [ D at aTyp e ( Da ta Ty pe . D at e )]21 [ D is pl ay Fo rm at ( A pp ly Fo rm at In Ed it Mo de = true , D a taFo rmatS t r in g = "{ :yyyy-MM-dd}" ) ←

]22 public D a teTime D ataDeCad as t ro { ge t ; se t ; }23 }24 }

Código C# 6.17: Usuario.cs

114 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 125/244

115 C AMADA DE A PRESENTAÇÃO

20 Adicione um novo controlador chamado Usuario .

1 namespace CamadaDeApresentacao .Contro l lers2 {3 p u b lic c las s U su ar io Co nt ro l le r : Co n t ro l ler4 {5 public ActionResult Editar ( )6 {7 Usuar io usuar io = ne w Usuar io8 {9 Id = 1 ,

1 Nome = "Rafae l Co sent in o " ,11 Email = "[email protected]" ,12 Senha = "123" ,13 Descr icao = "Sóc io - fu n d ad o r d a K 1 9 / I n s t ru to r " ,14 DataDeCadastro = DateTime .Now15 };16 return View(usuar io) ;17 }18 }

19 }Código C# 6.18: UsuarioController.cs

21 Adicione uma página associada à ação Editar do controlador Usuario .

1 @mo del Camad aD eA p resen tacao .Mo d e ls .U su ar io2 @{3 ViewBag .Title = "Editar" ;4 }56 <h2 >Editar</ h2 >78 @u s in g (H tml .Begin Form( ) )9 {

1 @ Ht ml . Ed it or Fo rM od el ()11 <in p ut ty pe ="submit" value ="Salvar" / >12 }

Código CSHTML 6.49: Editar.cshtml

Layouts

É comum que as páginas deuma aplicaçãoweb possuamconteúdoemcomum (porexemplo, umcabeçalho ou um rodapé). O conteúdo em comum pode ser replicado em todas as páginas atravésdo CTRL+C e CTRL+V. Porém, essa não é uma boa abordagem, pois quando alguma alteração precisaser realizada, todos os arquivos devem ser modicados. Também é comum que as páginas de umaaplicação web possuam um certo padrão visual. Daí surge o conceito de Layouts.

Conteúdo comum

Tudo que é comum a todas as páginas de um determinado grupo pode ser denido em umLayout. Dessa forma, qualquer alteração é facilmente realizada modicando-se apenas um arquivo.Por exemplo, suponha que toda página de uma aplicação web deva ter o mesmo título e a mesmaformatação. Podemos criar um Layout com o título desejado e com a referência ao arquivo CSS que

dene a formatação padrão.

www.facebook.com/k19treinamentos 115

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 126/244

C AMADA DE A PRESENTAÇÃO 116

1 <! D O CTY PE h tml>2 <html >3 <head >4 <title >@ViewBag.Tit le</ title >

5 @ St yl es . R en de r ( "~/Content/Site .css" )6 @ Sc ri pt s . Re nd er ( "~/Scr ip ts / jquery -1 .5 .1 .min . js" )7 </ head >89 <body >

1 < d iv i d ="header" >11 @Htm l. Ac ti onL in k( "Editoras" , "Index" , "Editora" )12 @Htm l. Ac ti onL in k( "Livros" , "Index" , "Livro" )13 </ di v >14 @ Re nd er Bo dy ( )15 < / body >16 < / html >

Código CSHTML 6.50: K19Layout.cshtml

No layout denido no código acima, utilizamos o método Render() das propriedades Styles eScripts para adicionarconteúdo CSSe JavaScript. Na tag<title> , acrescentamos @ViewBag.Title ,paraque cada página possadeniro seupróprio título. Por m, o método RenderBody() indicaondeo conteúdo denido em cada página será adicionado.

É recomendado que os arquivos que denam layouts sejam colocados na pasta Views\Share .

Mais SobreSuponhaque devemos adicionar diversos arquivos CSS à uma página de uma aplicação ASP.NET MVC. Se esses arquivos forem adicionados um a um da maneira tradicional

(com a tag <link> ), o número de requisições que os navegadores terão de realizar para carre-gar essa página será alto, afetando o desempenho. Para contornar esse problema, poderíamosagrupar o códigoCSS de todos os arquivos em apenas um. Contudo, essaabordagem dicultariaa manutenção do código CSS. Dessa forma, o ASP.NET MVC 4 possui um mecanismo capaz deagrupar o conteúdo CSS de diversos arquivos dinamicamente. Para usar esse mecanismo, bastainvocar o método Render() da propriedade Styles .

1 @Styles .Ren der ( "~/Content/Arquivo1.css" , "~/Content/Arquivo2.css" , "~/Content/ ←

Arquivo3.css" )

Código CSHTML 6.51: Utilizando o método Render para adicionar conteúdo CSS

Analogamente, a propriedadeScripts

possui o métodoRender()

, que também tem por obje-tivo agrupar o código JavaScript de diversos arquivos.

Com o layout denido, o próximo passo é indicar quais páginas utilizarão esse layout. Por exem-plo, podemos atualizar a página de edição de editoras para utilizar K19Layout.cshtml como layout.

1 @mo del K 1 9 .Mod e ls .Ed ito r a23 @{4 Layout = "~/Views/Shared/K19Layout.csh tml" ;56 / / D ef in e o t í tu lo e sp ec íf ic o d e st a p ág in a

7 Vie wB ag . Ti tl e = "Ed ição d e Ed i to r a" ;8 }9

116 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 127/244

117 C AMADA DE A PRESENTAÇÃO

1 < h2 >Ed ição d e Ed i to r a</ h2 >1112 @u s in g (H tml .Begin Form( ) ) {13 @ H tm l . E di t or F or M od e l ()14 <in p ut ty pe ="submit" value ="Salvar" / >

15 }

Código CSHTML 6.52: Edit.cshtml

Quando a página de edição de editoras é requisitada, o arquivo Edit.cshtml é processado antesdo arquivo K19Layout.cshtml ,oquepermitedenirovalordeViewBag.Title no arquivo Edit.cshtmle utilizá-lo no layout.

Para denir o layout de Edit.cshtml , foi necessário armazenar o caminho completo do arquivoque dene o layout na propriedade Layout . Este procedimento não é muito prático, pois em cadapágina que deseja utilizar esse layout é necessário denir esta propriedade.

A partir da terceira versão do ASP.NET MVC, temos uma nova funcionalidade que permite denirum layout padrão para todas as páginas, não havendo necessidade de denir a propriedade Layoutem cada página. Para isso, basta acrescentarmos o arquivo _ViewStart.cshtml à pasta View:

O _ViewStart.cshtml permite denirmos um código que será executado antes de cada páginaser renderizada. Nesse arquivo podemos denir, por exemplo, a propriedade Layout :

1 @{2 Layout = "~/Views/Shared/K19Layout.csh tml" ;3 }

Código CSHTML 6.53: _ViewStart.cshtml

www.facebook.com/k19treinamentos 117

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 128/244

C AMADA DE A PRESENTAÇÃO 118

Como este código é processado antes dos arquivos especícos de cada página, não há mais ne-cessidade de denir a propriedade Layout em cada arquivo especíco.

LacunasTambém podemos criar seçõesem umlayoutpara serempreenchidas comconteúdosespecícos

denidos nas páginas. Considere o seguinte layout.

1 <! D O CTY PE h tml>2 <html >3 <head >4 <title >@ViewBag.Tit le</ title >5 @ St yl es . R en de r ( "~/Content/Site .css" )6 @ Sc ri pt s . Re nd er ( "~/Scr ip ts / jquery -1 .5 .1 .min . js" )7 </ head >89 <body >

1 < d iv i d ="header" >11 @Htm l. Ac ti onL in k( "Editoras" , "Index" , "Editora" )12 @Htm l. Ac ti onL in k( "Livros" , "Index" , "Livro" )13 </ di v >14 <d iv i d ="sidebar" >@RenderSection( "Sidebar" , false)</ di v >15 <d iv i d ="conten t" >@RenderBody()</ di v >16 <d iv i d ="footer" >K 1 9 Tre inamen to s</ di v >17 < / body >18 < / html >

Código CSHTML 6.54: K19Layout.cshtml

No código acima, utilizamos o método @RenderSection( ) para criar uma seção no layout. Oprimeiro parâmetro (“Sidebar”) é o nome da seção e o segundo é um booleano que indica se o pre-

enchimento dessa seção é obrigatório ou não.Para denir 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 dene a seção Sidebar .

1 @mo del K 1 9 .Mod e ls .Ed ito r a23 @{4 Layout = "~/Views/Shared/K19Layout.csh tml" ;56 / / D ef in e o t í tu lo e sp ec íf ic o d e st a p ág in a7 Vie wB ag . Ti tl e = "Ed ição d e Ed i to r a" ;8 }9

1 < h2 >Ed ição d e Ed i to r a</ h2 >1112 @u s in g (H tml .Begin Form( ) ) {13 @ H tm l . E di t or F or M od e l ()14 <in p ut ty pe ="submit" value ="Salvar" / >15 }1617 @ s ec t io n S i de b ar {18 <p > S i de b ar d o c a da s tr o d e E d iç ã o d e E d it o ra < / p >19 }

Código CSHTML 6.55: Edit.cshtml

Exercícios de Fixação

118 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 129/244

119 C AMADA DE A PRESENTAÇÃO

22 Crie um arquivo chamado K19Layout.cshtml dentroda pasta Shared que ca na pasta Viewsdoprojeto CamadaDeApresentacao . Estearquivoservirádemodeloparaaspáginasdanossaaplicação.

1 <! D O CTY PE h tml>

2 <html >3 <head >4 <meta ch arse t ="utf -8" />5 <meta n ame="viewpor t" conten t ="width=device-width" / >6 <title >@ViewBag.Tit le</ title >7 @Styles .Render ( "~/Content/css" )8 @S cri pt s. Re nde r( "~/bundles /modern izr" )9 </ head >

1 < body >11 <header >12 <img s r c ="https : / / reader010.{domain}/reader010/h tml5/0617/5b26258c938a4/5b2625d2163ee.png"13 al t =" L o go v e rt i ca l d a K 19 " title ="K 1 9 Tre inamen to s" / >14 <span >K 1 9 Tre inamen to s</ span >15 </ header >1617 <section id ="main" >

18 @RenderBody ()19 </ section >221 < f oo te r > & co p y ;K 19 Tr ei n am e nt o s < / fo ot e r >22 @S cri pt s. Re nde r( "~/bundles / jquery" )23 @ Re nde rS ect io n( "scr ip ts" , r eq ui r ed : f a l se )24 < / body >25 < / html >

Código CSHTML 6.56: K19Layout.cshtml

23 Altere a página Lista.cshtml da pasta Views/Aluno para que ela utilize o layout denido noexercício anterior.

1 @mo del ICo l lec t ion <Camad aD eAp resentacao .Mo de ls .A lun o >23 @{4 ViewBag .Title = "Lis ta" ;5 Layout = "~/Views/Shared/K19Layout.csh tml" ;6 }78 <h2 >Tab ela d e A lu no </ h2 >9

1 < table >11 <tr >12 <th >AlunoID</ th >13 <th >Nome</th >14 <th >Email</ th >15 </ tr >1617 @f ore ac h ( var a in @ Mod el )18 {19 <tr >2 < td >@a.AlunoID</ td >21 <td >@a.Nome</td >22 <td >@a.Email</ td >23 </ tr >24 }25 < / table >

Código HTML 6.17: Lista.cshtml

Teste acessando o endereço: http://localhost:<PORTA_APP>/Aluno/Lista .

www.facebook.com/k19treinamentos 119

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 130/244

C AMADA DE A PRESENTAÇÃO 120

24 Dena a página K19Layout.cshtml como layout padrão para todas as telas. Altere o arquivo_ViewStart.cshtml da pasta Views.

1 @{

2 Layout = "~/Views/Shared/K19Layout.csh tml" ;3 }

Código CSHTML 6.57: _ViewStart.cshtml

Teste acessando as páginas da aplicação.

• http://localhost:<PORTA_APP>/Home/Index

• http://localhost:<PORTA_APP>/Aluno/Detalhes

• http://localhost:<PORTA_APP>/Aluno/Editar

• http://localhost:<PORTA_APP>/Aluno/Lista

• http://localhost:<PORTA_APP>/Usuario/Editar

• http://localhost:<PORTA_APP>/Relogio/Agora

25 Altere o arquivo Site.css da pasta Content para aplicar algumas regras de formatação às nossaspáginas.

1 ...2 h ea de r ,3 # m ai n ,4 f oo te r {5 width : 9 8 p x ;6 margin : a ut o ;7 }89 h ea de r {

1 border - bottom : 1 p x s ol i d # 6 66 6 66 ;11 padding : 1 p x ;12 }1314 h e ad e r s p a n {15 font - size : 2 px ;16 v er ti ca l - a li gn : m id dl e ;17 }1819 h e ad e r i m g {2 height : 8 px ;21 margin : 2 p x ;22 v er ti ca l - a li gn : m id dl e ;23 }2425 f o ot e r {26 border - to p : 1 p x s o li d # 6 66 6 66 ;27 padding : 1 p x ;28 margin - to p : 2 px ;29 text - alig n: cen ter ;3 font - size : 1 px ;31 }3233 # t o ol b ar {34 background : # 9 9 99 9 9 ;35 width : 9 7 p x ;36 margin : 1 p x a ut o ;

37 padding : 3 p x 5 p x ;38 }39

120 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 131/244

121 C AMADA DE A PRESENTAÇÃO

4 # t o ol b ar * {41 margin : 3 p x 5 p x ;42 }

Código CSS 6.1: Site.css

Teste acessando as páginas da aplicação (Dica: utilize o comando CTRL+F5 para garantir que onavegador solicite o novo conteúdo do arquivo Site.css ).

• http://localhost:<PORTA_APP>/Home/Index

• http://localhost:<PORTA_APP>/Aluno/Detalhes

• http://localhost:<PORTA_APP>/Aluno/Editar

• http://localhost:<PORTA_APP>/Aluno/Lista

• http://localhost:<PORTA_APP>/Usuario/Editar

• http://localhost:<PORTA_APP>/Relogio/Agora

26 Altere o arquivo K19Layout.cshtml da pasta Views\Shared .

1 <! D O CTY PE h tml>2 <html >3 <head >4 <meta ch arse t ="utf -8" />5 <meta n ame="viewpor t" conten t ="width=device-width" / >6 <title >@ViewBag.Tit le</ title >7 @Styles .Render ( "~/Content/css" )8 @S cri pt s. Re nde r( "~/bundles /modern izr" )9 </ head >

1 < body >11 <header >12 <img s r c ="https : / / reader010.{domain}/reader010/h tml5/0617/5b26258c938a4/5b2625d3171be.png"13 al t =" L o go v e rt i ca l d a K 19 " title ="K 1 9 Tre inamen to s" / >14 <span >K 1 9 Tre inamen to s</ span >15 </ header >16 <d iv i d ="toolbar" >17 @RenderSection ( "Toolbar" , r eq ui r ed : f a l se )18 </ di v >192 <section id ="main" >21 @RenderBody ()22 </ section >2324 < f oo te r > & co p y ;K 19 Tr ei n am e nt o s < / fo ot e r >25 @S cri pt s. Re nde r( "~/bundles / jquery" )26 @ Re nde rS ect io n( "scr ip ts" , r eq ui r ed : f a l se )27 < / body >28 < / html >

Código CSHTML 6.58: K19Layout.cshtml

27 Dena a seção Toolbar nas seguintes páginas.

1 @mo del Camad aD eA p resen tacao .Mo d e ls .A lu n o2 @{3 ViewBag .Title = "Editar" ;4 }

56 @ s ec t io n To ol b ar {7 <in pu t ty pe ="button" value ="Remo ver es te cad as t ro " />

www.facebook.com/k19treinamentos 121

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 132/244

C AMADA DE A PRESENTAÇÃO 122

8 }9

1 < h2 >Editar</ h2 >1112 @u s in g (H tml .Begin Form( ) )

13 {14 @ Ht ml . Ed it or Fo rM od el ()15 <in p ut ty pe ="submit" value ="Enviar" / >16 }

Código CSHTML 6.59: Editar.cshtml

1 @mo del Camad aD eA p resen tacao .Mo d e ls .A lu n o23 @{4 ViewBag .Title = "Detalhes" ;5 }67 @ s ec t io n To ol b ar {8 <in pu t ty pe ="button" value ="Remo ver es te cad as t ro " />9 }

111 <h2 >Detalhes</ h2 >1213 <p >14 A lu no ID : @ Mo de l. Al un oI D15 < / p >1617 <p >18 Nome : @ Mod el .Nome19 < / p >221 <p >22 Emai l: @ Mod el . Emai l23 < / p >

Código CSHTML 6.60: Detalhes.cshtml

1 @mo del ICo l lec t ion <Camad aD eAp resentacao .Mo de ls .A lun o >23 @{4 ViewBag .Title = "Lis ta" ;5 Layout = "~/Views/Shared/K19Layout.csh tml" ;6 }78 @ s ec t io n To ol b ar {9 <in p ut ty pe ="search" p laceholder= " D i gi t e o n om e d o a lu n o " />

1 < in p ut ty pe ="button" value ="Buscar" />11 }1213 <h2 >Tab ela d e A lu no </ h2 >1415 <table >16 <tr >17 <th >AlunoID</ th >18 <th >Nome</th >19 <th >Email</ th >2 </ tr >2122 @f ore ac h ( var a in @ Mod el )23 {24 <tr >25 <td >@a.AlunoID</ td >26 <td >@a.Nome</td >27 <td >@a.Email</ td >

28 </ tr >29 }3 < / table >

122 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 133/244

123 C AMADA DE A PRESENTAÇÃO

Código CSHTML 6.61: Lista.cshtml

Teste acessando as páginas da aplicação.

• http://localhost:<PORTA_APP>/Home/Index

• http://localhost:<PORTA_APP>/Aluno/Detalhes

• http://localhost:<PORTA_APP>/Aluno/Editar

• http://localhost:<PORTA_APP>/Aluno/Lista

• http://localhost:<PORTA_APP>/Usuario/Editar

• http://localhost:<PORTA_APP>/Relogio/Agora

28 Dena um conteúdo padrão para a seção Toolbar no layout.

1 <! D O CTY PE h tml>2 <html >3 <head >4 <meta ch arse t ="utf -8" />5 <meta n ame="viewpor t" conten t ="width=device-width" / >6 <title >@ViewBag.Tit le</ title >7 @Styles .Render ( "~/Content/css" )8 @S cri pt s. Re nde r( "~/bundles /modern izr" )9 </ head >

1 < body >11 <header >12 <img s r c ="https : / / reader010.{domain}/reader010/h tml5/0617/5b26258c938a4/5b2625d412090.png"13 al t =" L o go v e rt i ca l d a K 19 " title ="K 1 9 Tre inamen to s" / >14 <span >K 1 9 Tre inamen to s</ span >15 </ header >16 <d iv i d ="toolbar" >17 @if ( IsSectionDef ined ( "Toolbar" ) )18 {19 @RenderSection ( "Toolbar" , r eq ui r ed : f a l se ) ;2 }21 else22 {23 <in p ut ty pe ="button"24 value = " Vej a o s eu n úm e ro d a s or t e "25 onclick = "location .href=’ /Home/Index’" />26 }27 </ di v >2829 <section id ="main" >3 @RenderBody ()31 </ section >3233 < f oo te r > & co p y ;K 19 Tr ei n am e nt o s < / fo ot e r >34 @S cri pt s. Re nde r( "~/bundles / jquery" )35 @ Re nde rS ect io n( "scr ip ts" , r eq ui r ed : f a l se )36 < / body >37 < / html >

Código CSHTML 6.62: K19Layout.cshtml

Teste acessando as páginas da aplicação.

• http://localhost:<PORTA_APP>/Home/Index• http://localhost:<PORTA_APP>/Aluno/Detalhes

www.facebook.com/k19treinamentos 123

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 134/244

C AMADA DE A PRESENTAÇÃO 124

• http://localhost:<PORTA_APP>/Aluno/Editar

• http://localhost:<PORTA_APP>/Aluno/Lista

• http://localhost:<PORTA_APP>/Usuario/Editar

• http://localhost:<PORTA_APP>/Relogio/Agora

Partial views

Quanto mais elaborada é uma página de uma aplicação web, mais extenso é o seu código. Códi-gos muito extensos prejudicam a legibilidade e a manutenção da aplicação. Para organizar melhor ocó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.1 <h1 > P a r t e 1 < / h >2 <p > Co n teú d o d a p a r te1 </ p >

Código CSHTML 6.63: _Parte1.cshtml

1 <h1 > P a r t e 2 < / h >2 <p > Co n teú d o d a p a r te2 </ p >

Código CSHTML 6.64: _Parte2.cshtml

Mais SobrePor convenção, o nome dos arquivos que denem as telas parciais de uma aplicação ASP.NET MVC devem iniciar com o caractere “_”.

Por m, 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.

1 <html >2 <head >3 <title >Ex emp lo d e p a r tia l< / title >4 </ head >5

6 <body >7 Html . Part ia l ( "_Par te1" )8 Html . Part ia l ( "_Par te2" )9 </ body >

1 < / html >

Código CSHTML 6.65: Principal.cshtml

O método Partial() procura os arquivos _Parte1.cshtml e _Parte2.cshtml no mesmo dire-tório do arquivo principal. Caso ele não encontre, ele continua procurando esses arquivos na pastaViews\Shared . Essa lógica também é aplicada no método View que utilizamos na camada de con-trole.

O recurso de páginas parciais permite a criação de conteúdo reutilizável de forma mais clara econcisa. Informações podem ser compartilhadas entre as páginas principais e as páginas parciais

124 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 135/244

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 136/244

C AMADA DE A PRESENTAÇÃO 126

Código CSHTML 6.67: Create.cshtml

1 <! - - ~ /View s /Ed i tor a /Ed i t . c shtml - - >2 @mo del L iv r ar iaVir tu a l .Mo de ls .Ed i to r a34 @{5 Vie wB ag . Ti tl e = "Ed ição d e Ed i to r a" ;6 }78 <h2 >Ed ição d e Ed i to r a</ h2 >9

1 @H tml .Par t ia l ( "_Form" )

Código CSHTML 6.68: Edit.cshtml

Exercícios de Fixação

29 Adicione uma nova entidade chamada Post na pata Models.

1 namespace CamadaDeApresentacao .Models2 {3 p u b lic c las s Post4 {5 public s tr ing A u to r { ge t ; se t ; }67 public D a teTime D ata { ge t ; se t ; }89 public s tr ing Ti tulo { ge t ; se t ; }

111 public s tr ing Ca tego r ia { ge t ; se t ; }1213 public s tr ing Texto { ge t ; se t ; }14 }15 }

Código C# 6.19: Post.cs

30 Adicione um novo controlador chamado Post utilizando o template Empty MVC Controller.

1 namespace CamadaDeApresentacao .Contro l lers2 {3 p u b lic c las s Po s tCo n tro l le r : Co n tro l ler4 {5 public ActionResult Lis ta( )6 {7 ICollect ion < Post > posts = ne w List< Post >();89 fo r ( in t i = ; i < 1 ; i + + )

1 {11 posts .Add ( ne w Post12 {13 Autor = " A ut o r d o p os t " + i ,14 Categor ia = "Ca teg or ia " + i ,15 D at a = D at eT im e. No w. Su bt ra ct ( Ti me Sp an . Fr om Da ys ( i) ),16 Texto = i + " - L or e m i ps u m d o lo r s it a me t , c o ns e ct e tu r a d ip i sc i ng e li t . " ,

17 Titu lo = " T ít u lo d o p o s t " + i18 }) ;19 }

126 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 137/244

127 C AMADA DE A PRESENTAÇÃO

2 return View(posts) ;21 }22 }23 }

Código C# 6.20: PostController.cs

31 Adicione uma página associada à ação Lista do controlador Post.

1 @mo del IEn u merab le<Camad aD eAp resentacao .Mo de ls .Po st>2 @{3 ViewBag .Title = "Lis ta" ;4 }5 <h2 >Lista</ h2 >67 @ f or e ac h ( v ar p os t i n M od e l ) {8 @Html .Par tial ( "_Post" , p os t )9 }

Código CSHTML 6.69: Lista.cshtml

32 Adicioneumapartial para exibiras informações deumPost. Crie umarquivo chamado_Post.cshtmlna pasta Views/Post

1 @mo del Camad aD eA p resen tacao .Mo d e ls .Po s t23 < a rt i cl e >4 <header >5 <h1 >@Model.Titu lo</ h1 >6 <di v ><small >@Mo del .A u tor - @Mo del .D a ta .To St r ing ( "dd/MM/yyyy") </ small ></ di v >7 </ header >8 <p >@Model.Texto</ p >9 <footer >

1 Categoria : @Model .Categoria11 </ footer >12 < /a r t ic le>

Código CSHTML 6.70: _Post.cshtml

Para testar, acesse a página http://localhost:<PORTA_APP>/Post/Lista

www.facebook.com/k19treinamentos 127

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 138/244

C AMADA DE A PRESENTAÇÃO 128

128 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 139/244

C AMADA DE CONTROLE

C A P

Í T U L O

7No ASP.NET MVC as urls são mapeadas para métodos (ações) em classes que denem os chama-

das controladores . As requisições enviadas pelos navegadores são processadas pelos controlado-res. O processamentorealizado porum controlador para tratarumarequisição consiste basicamenteem:

• 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 ousuário como resposta à sua requisição.

Para que uma classe seja considerada um controlador, ela deve seguir algumas regras.

• O nome da classe deve ter o suxo “Controller”.

• Aclassedeve implementar a interfaceSystem.Web.Mvc.IController

ou herdarda classeSys-

tem.Web.Mvc.Controller .

Raramente, você denirá umaclassepara criar um controlador implementandoa interface ICon-troller . Comumente as classes que denem controladores derivam de Controller . Diversas pro-priedade e métodos são herdados da classe Controller . Essas propriedades facilitam o processa-mento das requisições e a utilização dos recursos do ASP.NET MVC.

Actions

Os controladores e as ações são elementos fundamentais de uma aplicação ASP.NET MVC. Umcontrolador pode conter diversas ações. As ações sãoutilizadaspara processaras requisições realiza-das pelos navegadores. Para criar uma ação, é necessário denir um método public dentro da classede um controlador. Os parâmetros desse método podem ser utilizados para receber os dados envia-dos pelos usuários através de formulários HTML. Esse método deve devolver um ActionResult queserá utilizado pelo ASP.NET MVC para denir o que deve ser executado depois que a ação terminar.

Quando um usuário faz uma requisição HTTP através de um navegador, o ASP.NET MVC vericana tabela de rotas o controlador e a ação associados à url da requisição realizada. Essa tabela édenida 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. Com essa rota, se uma requisição for

www.facebook.com/k19treinamentos 129

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 140/244

C AMADA DE CONTROLE 130

realizada para a url http://www.k19.com.br/Editora/Listagem , o controlador denido pela classeEditoraController e a ação implementada pelo método Listagem() dessa classe serão escolhidospara processar essa requisição.

Se uma requisição for realizada para a url http://www.k19.com.br/Editora/Remove/1 , o con-trolador denido pela classe EditoraController e a ação implementada pelo método Remove()dessa classe serão escolhidos para processar a requisição realizada. Além disso, o valor 1 será pas-sado como parâmetro para o método Remove(). Veremos mais sobre rotas no Capítulo ??.

ActionResult

Quando uma ação termina, o método correspondente deve devolver um ActionResult . O valordevolvido indica para o ASP.NET MVC o que deve ser executado depois da ação. Veja abaixo uma

lista com alguns tipos especícos de ActionResult

que podem ser utilizados.

ViewResult: Devolve uma página da camada de apresentação. Considere o seguinte exemplo.

1 p u b l ic c lass TesteContro l ler2 {3 public ActionResult Acao()4 {5 return View() ;6 }7 }

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 serutilizado 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.

Por outro lado, podemos especicar o nome do arquivo que dene a página de resposta. Vejao exemplo abaixo.

1 return View( "NomeDaView") ;

Além disso, podemos passar um objeto para a camada de apresentação. Esse objeto será utili-zado nas páginas fortemente tipadas como vimos no Capítulo 6.

1 return View(editora) ;

Também é possível especicar o nome do arquivo que dene a página de resposta e o objetoque deve ser transmitido para a camada de apresentação ao mesmo tempo.

1 return View( "NomeDaView", ed i to r a ) ;

PartialViewResult: Devolve uma página parcial da camada de apresentação. Exemplos:

130 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 141/244

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 142/244

C AMADA DE CONTROLE 132

1 <html >2 <head >3 <title >Cad as t ro d e Ed i to r a</ title >4 </ head >

5 <body >6 <fo rm ac t io n ="/Editoras /Salva" method ="post" >7 Nome : <in p ut ty pe ="tex t" name="nome" />8 Email : < in p ut ty pe ="tex t" name="email" / >9 <in pu t ty pe ="submit" / >

1 </ form >11 < / body >12 < / html >

Código CSHTML 7.1: Cadastra.csthml

No código acima, criamos um formulário HTML com os parâmetros nome e email . Esses parâ-metros serão recuperados na ação Salva denida no código abaixo.

1 ...2 [ H t tp P os t ]3 public ActionResult Salva( string nome, str ing email)4 {5 E di to ra e di to ra = ne w E di t or a { N om e = n om e , E ma il = e m ai l } ;6 d b . Ed i to r as . A dd ( e d it o ra ) ;7 return View() ;8 }9 ...

Código C# 7.15: EditoraController.cs

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.

1 [ H t tp P os t ]2 public A c t io n Resu l t Sa lva (Ed i to ra ed i to r a )3 {4 d b . Ed i to r as . A dd ( e d it o ra ) ;5 return View() ;6 }

Código C# 7.16: EditoraController.cs

As propriedades dos objetos recebidos como argumentos nas ações dos controladores precisamter os mesmos nomes dos parâmetros HTTP ignorando-se letras maiúsculas ou minúsculas.

Exercícios de Fixação

1 Crie um projeto do tipo ASP.NET MVC 4 Web Application chamado CamadaDeControle no Visual Studio 2012 Express for Web . Utilize o template Basic Project.

2 Adicione uma entidade chamada Produto na pasta Models do projeto CamadaDeControle .

1 namespace CamadaDeContro le .Models

2 {3 p u b lic c las s Produto4 {

132 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 143/244

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 144/244

C AMADA DE CONTROLE 134

33 }34 }

Código C# 7.19: ProdutoController.cs

5 Adicione uma tela associada à ação Lista do controlador Produto com o seguinte conteúdo.

1 @u s in g CamadaD eCo nt ro le .Mo de ls2 @mo del IEn u merab le<Pro d u to >34 @{5 ViewBag .Title = "Lis ta" ;6 }78 <h2 >Lista</ h2 >9

1 < table >11 <tr >12 <th >@H tml .D isp lay NameFor (m => m.N o me)</th >13 <th >@H tml .D isp lay NameFor (m => m.D escricao )< / th >14 <th >@H tml .D isp lay NameFor (m => m.Preco )< / th >15 </ tr >16 @fo reach (v ar p ro du to in Mo d e l )17 {18 <tr >19 <td >@H tml .D isp layFo r (m => p ro du to .N o me)</ td >2 < td >@H tml .D isp layFo r (m => p ro du to .D escr icao )< / td >21 <td >@H tml .D isp layFo r (m => p ro du to .P reco )< / td >22 </ tr >23 }24 < / table >

Código HTML 7.1: Lista.cshtml

6 Adicione uma tela associada à açãoCadastra do controlador Produto com o seguinte conteúdo.

1 @mo del CamadaD eCo nt ro le .Mo de ls .P ro du to23 @{4 Vie wB ag . Ti tl e = "Cadastra" ;5 }67 <h2 >Cadastra</ h2 >8

9 @u s in g (H tml .Begin Form( ) )1 {11 @ H tm l . E di t or F or ( m = > m . P ro d ut o ID )12 <di v >@H tml .Lab e lFo r (m => m.N o me)</di v >13 @ H tm l . E di t or F or ( m = > m . N om e )14 <di v >@H tml .Lab e lFo r (m => m.D escricao )< / di v >15 @ H tm l . E di t or F or ( m = > m . D es c ri c ao )16 <di v >@H tml .Lab e lFo r (m => m.Preco )< / di v >17 @ H tm l . E di t or F or ( m = > m . P re co )1819 <di v ><in p ut ty pe ="submit" value ="Cadastrar" /></ di v >2 }

Código HTML 7.2: Cadastra.cshtml

Para ver o resultado, acesse a urlhttp://localhost:<PORTA_APP>/Produto/Cadastra .

134 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 145/244

135 C AMADA DE CONTROLE

7 Altere a ação Cadastra do controlador Produto .

1 namespace CamadaDeContro le .Contro l lers2 {3 p u b lic c las s P ro d u to Co nt ro l le r : Co n t ro l ler4 {5 public ActionResult Lis ta( )6 {7 K19Context ctx = ne w K19Context( ) ;8 return View(ctx .Produtos) ;9 }

111 [ HttpGet ]12 public ActionResult Cadastra( )13 {14 return View() ;15 }1617 [ HttpPost ]18 public A c t io n Resu l t Cad ast r a (P ro du to p )

19 {2 K19Context ctx = ne w K19Context( ) ;21 ctx .Produtos .Add (p) ;22 ctx .SaveChanges () ;2324 return RedirectToAction( "Lis ta" ) ;25 }26 }27 }

Código C# 7.20: ProdutoController.cs

Para testar, acesse a urlhttp://localhost:<PORTA_APP>/Produto/Cadastra .

TempData

Ao efetuar um redirecionamento, uma nova requisição é realizada pelo navegador. Nesta novarequisiçã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 pro-priedade TempData.

Por exemplo, ao cadastrar uma editora, podemos efetuar um redirecionamento para a tela delistagem de editoras. Na propriedade TempData, podemos acrescentar uma mensagem indicando oeventual sucesso da operação. Veja o exemplo abaixo.

1 ...2 [ H t tp P os t ]3 public A c t io n Resu l t Sa lva (Ed i to ra ed i to r a )4 {5 db . Ed it or as . Add ( ed it or a) ;6 db .Sa ve Ch an ge s() ;7 TempData ["Mensagem"] = "Ed i to r a cad ast r ad a co m su cesso ! " ;8 return RedirectToAction( "Index" ) ;9 }

1 ...

Código C# 7.21: EditoraController.cs

Nacamadadeapresentação, podemos recuperar os dados armazenados na propriedade TempData. Veja o código a seguir:

www.facebook.com/k19treinamentos 135

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 146/244

C AMADA DE CONTROLE 136

1 @ if ( Te mp D at a [ "Mensagem"] ! = n u ll )2 {3 <p >@TempData["Mensagem"]</ p >4 }

Código CSHTML 7.2: Recuperando dados armazenados na propriedade TempData

Exercícios de Fixação

8 Altere a ação Cadastra do controlador Produto .

1 ...2 public A c t io n Resu l t Cad as t r a (P rod u to p )

3 {4 K1 9Co nte xt ctx = ne w K19Context( ) ;5 c tx . P ro du to s . Ad d (p );6 c tx . S av eC ha ng es ( );78 Vie wB ag . Me ns ag em = "P ro d uto cad ast r ad o co m su cesso ! " ;9

1 return RedirectToAction( "Lis ta" ) ;11 }12 ...

Código C# 7.22: ProdutoController.cs

9 Modique o arquivo Lista.cshtml da pasta Views/Produto .1 @u s in g CamadaD eCo nt ro le .Mo de ls2 @mo del IEn u merab le<Pro d u to >34 @{5 ViewBag .Title = "Lis ta" ;6 }78 <h2 >Lista</ h2 >9

1 @if (View Bag .Men sagem != n u ll )11 {12 <di v >@ViewBag.Mensagem</di v >13 }

1415 <table >16 <tr >17 <th >@H tml .D isp lay NameFor (m => m.N o me)</th >18 <th >@H tml .D isp lay NameFor (m => m.D escricao )< / th >19 <th >@H tml .D isp lay NameFor (m => m.Preco )< / th >2 </ tr >21 @fo reach (v ar p ro du to in Mo d e l )22 {23 <tr >24 <td >@H tml .D isp layFo r (m => p ro du to .N o me)</ td >25 <td >@H tml .D isp layFo r (m => p ro du to .D escr icao )< / td >26 <td >@H tml .D isp layFo r (m => p ro du to .P reco )< / td >27 </ tr >28 }29 < / table >

Código CSHTML 7.3: Lista.cshtml

136 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 147/244

137 C AMADA DE CONTROLE

Teste a aplicação acessando a urlhttp://localhost:<PORTA_APP>/Produto/Cadastra . Veri-que que a mensagem de sucesso não aparecerá.

10 Altere novamente a ação Cadastra do controlador Produto .1 ...2 public A c t io n Resu l t Cad as t r a (P rod u to p )3 {4 K1 9Co nte xt ctx = ne w K19Context( ) ;5 c tx . P ro du to s . Ad d (p );6 c tx . S av eC ha ng es ( );78 TempData ["Mensagem"] = "P ro d uto cad as t r ado co m su cesso ! " ;9

1 return RedirectToAction( "Lis ta" ) ;11 }12 ...

Código C# 7.23: ProdutoController.cs

11 Modique o arquivo Lista.cshtml da pasta Views/Produto .

1 @u s in g CamadaD eCo nt ro le .Mo de ls2 @mo del IEn u merab le<Pro d u to >34 @{5 ViewBag .Title = "Lis ta" ;6 }78 <h2 >Lista</ h2 >9

1 @if (Temp Data [ "Mensagem"] ! = n ul l )11 {12 <di v >@TempData["Mensagem"]</ di v >13 }1415 <table >16 <tr >17 <th >@H tml .D isp lay NameFor (m => m.N o me)</th >18 <th >@H tml .D isp lay NameFor (m => m.D escricao )< / th >19 <th >@H tml .D isp lay NameFor (m => m.Preco )< / th >2 </ tr >21 @fo reach (v ar p ro du to in Mo d e l )22 {23 <tr >24 <td >@H tml .D isp layFo r (m => p ro du to .N o me)</ td >25 <td >@H tml .D isp layFo r (m => p ro du to .D escr icao )< / td >26 <td >@H tml .D isp layFo r (m => p ro du to .P reco )< / td >27 </ tr >28 }29 < / table >

Código CSHTML 7.4: Lista.cshtml

Teste a aplicação acessando a urlhttp://localhost:<PORTA_APP>/Produto/Cadastra . Veri-que que a mensagem de sucesso aparecerá.

Rotas

www.facebook.com/k19treinamentos 137

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 148/244

C AMADA DE CONTROLE 138

Para acessar uma determinada ação da nossa aplicação, os usuários devem realizar uma requi-sição HTTP utilizando a url correspondente à ação. Por exemplo, para acessar a listagem de edito-ras, é necessário digitar na barra de endereço do navegador a url http://localhost:<PORTA_APP>/Editora/Index . Perceba que o o nome do controlador e o nome da ação desejados fazem parte daurl. O formato dessas urls é denido por rotas criadas no arquivo RouteConfig.cs e carregadas noarquivo Global.asax . O código abaixo mostra a rota padrão inserida nos projetos ASP.NET MVC 4.

1 ro u tes .Map Rou te (2 name : "Default" ,3 url : "{contro l ler}/{action}/{id}" ,4 defaults : ne w { c o nt r ol l er = "Home", a c t i o n = "Index" , i d = U r lP a ra m et e r. O pt i on a l }5 ) ;

Código C# 7.24: RouteCong.cs

O primeiroargumentodo método MapRouteé o nomeda rota, o segundo é a expressão que dene

o formato da rota e o terceiro é o conjunto de valores padrão dos parâmetros da rota. A expressão que determina o formato da rota Default utilizatrêsparâmetros: controller , action

e id . Dessa forma, se o usuário realizar uma requisição HTTP utilizando url http://localhost:<PORTA_APP>/Editora/Remove/1 , o ASP.NET MVC criará uma instância do controlador Editora eexecutará o método Remove() passando o valor 1 como argumento.

Basicamente, as rotas associam urls e ações. Veja alguns exemplos de como as urls serão proces-sadas de acordo com as regras de rotas.

URL Mapeamento da URL/ controller = "Home", action = "Index"/Livro controller = "Livro", action = "Index"/Livro/Adiciona controller = "Livro", action = "Adiciona"/Livro/Remove/1 controller = "Livro", action = "Remove", id = 1

Adicionando uma rota

Para acrescentar uma rota, podemos utilizar o método MapRoute() . Suponha que a listagem deeditoras deva ser acessada através da url http://localhost:<PORTA_APP>/Catalogo . Nesse caso,podemos adicionar uma rota no arquivo RoutesConfig.cs , como mostrado abaixo.

1 ...2 r o u tes .Map Rou te (3 name : "N o va Ro ta" ,4 url : "Catalogo" ,5 defaults : ne w { c o nt r ol l er = "Editora" , a ct i on = "Index" }6 ) ;7 ...

Código C# 7.25: RoutesCong.cs

Importante As rotas são processadas na ordem em que foram inseridas. Portanto, é importantedenir as rotas mais especícas antes das rotas mais genéricas.

138 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 149/244

139 C AMADA DE CONTROLE

Adicionando Parâmetros nas Rotas

Podemos acrescentar parâmetros às rotas. Por exemplo, na rota criada anteriormente para alistagem de editoras, poderíamos adicionar um parâmetro para limitar a quantidade de editoras lis-

tadas.1 ro u tes .Map Rou te (2 name : "N o va Ro ta" ,3 url : "Catalogo/{maximo}" ,4 defaults : ne w { c o nt r ol l er = "Editora" , a ct i on = "Index" }5 ) ;

Código C# 7.26: RoutesCong.cs

Por padrão, os parâmetros adicionados a uma rota são obrigatórios. Dessa forma, no exemploacima, a listagem de editoras só poderá ser acessada se o valor do parâmetro maximo for denido naurl da requisição. Por exemplo, http://localhost:<PORTA_APP>/Catalogo/2 . Se uma requisiçãofor realizada para a url http://localhost:<PORTA_APP>/Catalogo , um erro ocorrerá. Para mudaresse comportamento, podemos tornar o parâmetro maximo opcional. Veja o código a seguir.

1 ...2 r o u tes .Map Rou te (3 name : "N o va Ro ta" ,4 url : "Catalogo/{maximo}" ,5 defaults : ne w { c o nt r ol l er = "Editora" , a ct i on = "Index" ,6 m ax im o = U rl Pa ra me te r. Op ti on al }7 ) ;8 ...

Código C# 7.27: RoutesCong.cs

Os parâmetros das rotas podem ser recuperados nas ações. Observe o exemplo abaixo.

1 ...2 public ActionResult Index( in t ? max imo )3 {4 / / imp lemen tação5 }6 ...

Código C# 7.28: EditoraController.cs

Ao denir parâmetros opcionais, devemos utilizar parâmetros do tipo nullable type nas ações,pois quando o parâmetro não estiver denido na url de uma requisição, o valor null será atribuídoao parâmetro da ação. Por exemplo, para os tipos int e double , devemos utilizar int? e double? ,respectivamente.

Exercícios de Fixação

12 Altere a rota padrão do projeto CamadaDeControle . Para isso, modique o arquivo RouteCon-g.cs da pasta App_Start.

1 ...2 r o u tes .Map Rou te (3 name : "Default" ,

www.facebook.com/k19treinamentos 139

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 150/244

C AMADA DE CONTROLE 140

4 url : "{contro l ler}/{action}/{id}" ,5 defaults : ne w {6 contro l ler = "Produto" ,7 act ion = "Lis ta" ,8 id = U rl Pa ra me te r. O pt io na l

9 }1 ) ;11 ...

Código C# 7.29: RouteCong.cs

Teste essa nova conguração acessando a url http://localhost:<PORTA_APP>/ .

13 Adicione uma rota no projeto CamadaDeControle . Para isso, modique o arquivo RouteCon-g.cs da pasta App_Start.

1 ...2 r o u tes .Map Rou te (3 name : "ProdutoLis taPorPreco" ,4 url : "Produto /Lis ta/{PrecoMinimo}/{PrecoMaximo}" ,5 defaults : ne w { c o nt r ol l er = "Produto" , a ct i on = "Lis ta" }6 ) ;7 ...

Código C# 7.30: RouteCong.cs

OBS: A rota ProdutoListaPorPreco deve ser adicionada antes da rota Default.

14 Altere a ação Lista do controlador Produto .

1 ...2 public ActionResult Lis ta( double ? precoMinimo , double ? p r ecoMax imo )3 {4 K1 9Co nte xt ctx = ne w K19Context( ) ;5 v ar p r od u to s = c tx . P r od u to s . A s En u me r ab l e () ;67 if ( p r eco Minimo != null && p recoMax imo != null )8 {9 produtos = from p in produtos

1 w he re p . Pr ec o >= p re co Mi ni mo & p . Pr ec o <= p re co Ma xi mo11 select p ;12 }1314 return View(produtos) ;15 }16 ...

Código C# 7.31: ProdutoController.cs

Teste a aplicação acessando a url http://localhost:<PORTA_APP>/Produto/Lista/ /2 . Al-tere os valores 0 e 200 para obter listas de produtos diferentes.

15 Adicione duas ações no controlador Produto para implementar a edição de produtos.

1 ...2 public A c t io n Resu l t Ed i ta r ( in t i d = )

3 {4 K1 9Co nte xt ctx = ne w K19Context( ) ;5 P ro du to p = c tx . P ro du to s . Fi nd ( id ) ;

140 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 151/244

141 C AMADA DE CONTROLE

67 if ( p = = null )8 {9 return HttpNotFound() ;

1 }

1112 return View(p) ;13 }1415 [H t tp Po s t ]16 public A c t io n Resu l t Ed i ta r (P ro d uto p )17 {18 K 19 Co nt ex t c tx = ne w K19Context( ) ;19 c tx .Ent ry (p ) .S ta te = Sy s tem.D ata .En t i ty Sta te .Mo d if ied ;221 c tx . S a ve C ha n ge s ( ) ;2223 return RedirectToAction( "Lis ta" ) ;24 }25 ...

Código C# 7.32: ProdutoController.cs

16 Modique a página de listagem de produtos. Para isso, altere o arquivo Lista.cshtml da pasta Views/Produto .

1 @u s in g CamadaD eCo nt ro le .Mo de ls2 @model IEnumerable <Produto >34 @{5 ViewBag .Title = "Lis ta" ;6 }7

8 <h2>Lista </h2>9

1 @if (Temp D ata [ "Mensagem"] != null )11 {12 < di v > @Tem pD at a ["Mensagem"]</d iv>13 }1415 < tab le>16 <tr >17 < th > @ Ht ml . D is pl ay Na me Fo r (m = > m . No me ) </ th >18 < th > @ H tm l . D is p la y Na m eF o r (m = > m . D e sc r ic a o ) </ th >19 < th > @ Ht ml . D is pl ay Na me Fo r (m = > m . Pr ec o ) </ th >2 <th ></ th >21 </ tr >22 @fo reach (v ar p ro du to in Model)23 {24 <tr >25 < td > @ H tm l . D is p la y Fo r ( m = > p r od u to . N om e ) </ td >26 < td > @ H tm l . D is p la y Fo r ( m = > p r od u to . D e sc r ic a o ) </ td >27 < td > @ H tm l . D is p la y Fo r ( m = > p r od u to . P r ec o ) </ td >28 < td > @H tm l. A ct io nL in k( "Editar" , "Editar" , ne w { id = p ro du to .P ro d uto ID })< / td >29 </ tr >3 }31 < / tab le>

Código C# 7.33: Lista.cs

17 Adicione uma página associada à ação Editar do controlador Produto .

1 @mo del CamadaD eCo nt ro le .Mo de ls .P ro du to2

www.facebook.com/k19treinamentos 141

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 152/244

C AMADA DE CONTROLE 142

3 @{4 ViewBag .Title = "Editar" ;5 }67 <h2>Editar </h2>

89 @u s in g (H tml .Begin Form( ) )1 {11 @ H tm l . E di t or F or ( m = > m . P ro d ut o ID )12 < di v > @ Ht ml . L a be l Fo r ( m = > m. N om e ) </ di v >13 @ H tm l . E di t or F or ( m = > m . N om e )14 < di v > @ Ht ml . L a be l Fo r ( m => m . D es c ri c ao ) < / di v >15 @ H tm l . E di t or F or ( m = > m . D es c ri c ao )16 < di v > @ Ht ml . L a be l Fo r ( m = > m. P r ec o ) </ d iv >17 @ H tm l . E di t or F or ( m = > m . P re co )1819 < di v >< i np ut t yp e = "submit" value= "Editar" /></d iv>2 }

Código C# 7.34: Editar.cs

Teste a aplicação acessando a url http://localhost:<PORTA_APP>/ . Altere os dados de algunsprodutos.

142 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 153/244

V ALIDAÇÃO

C A P

Í T U L O

8Os usuáriospodem cometererros ao preencher um formulário. Por exemplo,esquecer de preen-

cher um campo que é obrigatório. Os parâmetros enviados pelos usuários devem ser validados pelaaplicação com o intuito de não permitir o armazenamento de informações erradas.

Controller

O primeiro passo para implementar a validação dos parâmetros enviados através de formuláriosHTML é denir a lógica de validação na camada de controle.

1 if ( ed i to ra .N o me == null | | ed i to r a .N o me.Tr im( ) .Len g th == )2 {3 / / E rr o d e Va li d aç ã o4 }

Código C# 8.1: Denindo as regras de validação

O segundo passo é denir 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 objetopode ser acessado através da propriedade ModelState .

1 if ( ed i to ra .N o me == null | | ed i to r a .N o me.Tr im( ) .Len g th == )2 {3 M o de l St a te . A d d Mo d el E rr o r ( "Nome", " O c a mp o N om e é o b ri g at ó ri o " ) ;4 }

Código C# 8.2: Denindo as mensagens de erro de validação

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: oprimeiro é o grupo da mensagem e o segundo e a mensagem propriamente.

O código de validação pode ser colocado nos controladores, mais especicamente nas ações. Sealgum erro for encontrado, o uxo de execução pode ser redirecionado para uma página que mostreas mensagens informativas aos usuários. Normalmente, essa página é a mesma do formulário quefoi preenchido incorretamente. O ModelState possui uma propriedade que indica se erros foramadicionados ou não. Essa propriedade chama-se IsValid .

1 [ H t tp P os t ]2 public A c t io n Resu l t Sa lva (Ed i to ra ed i to r a )3 {4 if ( ed i to ra .N o me == null | | ed i to r a .N o me.Tr im( ) .Len g th == )5 {6 ModelState .AddModelError ( "Nome", " O c am p o N om e é o b ri g at ó ri o . " ) ;

7 }8 if (ModelState . I sValid)9 {

www.facebook.com/k19treinamentos 143

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 154/244

V ALIDAÇÃO 144

1 db .Editoras .Add (editora );11 TempData ["mensagem"] = "A ed i to r a fo i cad as t r ada co m su cesso ! " ;12 return RedirectToAction( "Index" ) ;13 }14 else

15 {16 return View( "Cadastra" ) ;17 }18 }

Código C# 8.3: EditoraController.cs

O ASP.NET MVC também pode adicionar mensagens no ModelState antes do controlador serchamado. Normalmente, essas mensagens estão relacionadas a erros de conversão. Por exemplo,um campo que espera um número é preenchido com letras.

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 todasas mensagens de erro.

1 @mo del K 1 9 .Mod e ls .Ed ito r a23 @{4 Vie wB ag . Ti tl e = "Cad ast ro d e Ed i to r a" ;5 }67 <h2 >Cad ast ro d e Ed i to r a</ h2 >

89 @u s in g (H tml .Beg in Fo rm( ) ) {1 @ Ht m l . Va l id a ti o nS u mm a ry ( )1112 <br />1314 @ H tm l . L ab e lF o r ( mo de l = > mo de l . N om e )15 @ H tm l . E di t or F or ( m o de l => m od e l . No me )1617 <br />1819 @ H tm l . L ab e lF o r ( mo de l => m od e l . Em a il )2 @ H tm l . E di t or F or ( m o de l => m od e l . Em ai l )2122 <br />23

24 <in p ut ty pe ="submit" value ="Enviar" / >25 }

Código CSHTML 8.1: Cadastra.cshtml

Podemos utilizar o método ValidationMessageFor() para mostrar somente as mensagens deerro de validação de um determinado grupo.

Para não mostrar erros dos grupos com o ValidationSummary() , devemos passar como parâme-tro o valor true . Nesse caso, apenas os erros que não estão associados a um grupo especíco serãoapresentados pelo ValidationSummary() .

1 @mo del L iv r ar iaVir tu a l .Mo de ls .Ed i to r a23 @{

144 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 155/244

145 V ALIDAÇÃO

4 Vie wB ag . Ti tl e = "Cad ast ro d e Ed i to r a" ;5 }67 <h2 >Cad ast ro d e Ed i to r a</ h2 >8

9 @u s in g (H tml .Beg in Fo rm( ) ) {1 @ Ht m l . Va l id a ti o nS u mm a ry ( t r ue )1112 <br />1314 @ H tm l . L ab e lF o r ( mo de l = > mo de l . N om e )15 @ H tm l . E di t or F or ( m o de l => m od e l . No me )16 @ Ht m l . Va l id a ti o nM e ss a ge F or ( m o de l = > m od el . N om e )1718 <br />192 @ H tm l . L ab e lF o r ( mo de l => m od e l . Em a il )21 @ H tm l . E di t or F or ( m o de l => m od e l . Em ai l )22 @ Ht m l . Va l id a ti o nM e ss a ge F or ( m o de l = > m o de l . E ma il )2324 <br />2526 <in p ut ty pe ="submit" value ="Enviar" / >27 }

Código CSHTML 8.2: Cadastra.cshtml

Exercícios de Fixação

1 Crie um projeto do tipo ASP.NET MVC4 Web Application chamado Validacao no Visual Studio2012 Express for Web. Utilize o template Basic Project.

2 Adicione uma entidade chamada Jogador na pasta Models do projeto Validacao .

1 namespace Validacao .Models2 {3 p u b lic c las s Jogador4 {5 [ H id de nI np ut ( D is pl ay Va lu e = false ) ]6 p u b lic in t Jo g ad or ID { ge t ; se t ; }78 public s tr ing N o me { ge t ; se t ; }9

1 p u b lic in t ? N um e ro { ge t ; se t ; }1112 public double ? A lt ur a { ge t ; se t ; }13 }14 }

Código C# 8.4: Jogador.cs

3 Adicione um DbContext para registrar a entidade Jogador e utilizar os recursos do Entity Fra-mework. Crie uma classe chamada K19Context na pasta Models.

1 namespace Validacao .Models

2 {3 p u b lic c las s K 1 9 Co n tex t : D b Con tex t4 {

www.facebook.com/k19treinamentos 145

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 156/244

V ALIDAÇÃO 146

5 public DbSet<Jogador > Jogadores { ge t ; se t ; }6 }7 }

Código C# 8.5: K19Context.cs

4 Adicione um controlador chamado Jogador utilizando o template Empty MVCController.

1 namespace Validacao .Contro l lers2 {3 p u b lic c las s Jo g ad o rCo nt ro l le r : Co n t ro l ler4 {5 public ActionResult Lis ta( )6 {7 K19Context ctx = ne w K19Context( ) ;8 return View(ctx .Jogadores) ;9 }

111 [ HttpGet ]12 public ActionResult Cadastra( )13 {14 return View() ;15 }1617 [ HttpPost ]18 public A c t io n Resu l t Cad as t r a ( Jo gad o r j )19 {2 K19Context ctx = ne w K19Context( ) ;21 ctx .J oga dor es . Add (j );22 ctx .SaveChanges () ;2324 return RedirectToAction( "Lis ta" ) ;25 }

26 }27 }

Código C# 8.6: JogadorController.cs

5 Adicione uma tela associada à ação Lista do controlador Jogador com o seguinte conteúdo.

1 @u s in g Val id acao .Mod e ls2 @mo del IEn u merab le<Jo g ad or>34 @{5 ViewBag .Title = "Lis ta" ;6 }78 <h2 >Lista</ h2 >9

1 < table >11 <tr >12 <th >@H tml .D isp lay NameFor (m => m.N o me)</th >13 <th >@H tml .D isp lay NameFor (m => m.N u mero )</th >14 <th >@H tml .D isp lay NameFor (m => m.A l tu ra )< / th >15 </ tr >16 @fo reach (v ar jo g ad o r in Mo d e l )17 {18 <tr >19 <td >@H tml .D isp layFo r (m => jo g ad o r.N o me)</ td >2 < td >@H tml .D isp layFo r (m => jo g ad o r.N u mero )</ td >21 <td >@H tml .D isp layFo r (m => jo g ad o r.A l tur a )< / td >

22 </ tr >23 }24 < / table >

146 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 157/244

147 V ALIDAÇÃO

Código HTML 8.1: Lista.cshtml

6 Adicione uma tela associada à açãoCadastra do controlador Jogador com o seguinte conteúdo.

1 @mo del Va l id acao .Mod e ls . Jo gad o r23 @{4 Vie wB ag . Ti tl e = "Cadastra" ;5 }67 <h2 >Cadastra</ h2 >89 @u s in g (H tml .Begin Form( ) )

1 {11 <di v >@H tml .Lab e lFo r (m => m.N o me)</di v >12 @ H tm l . E di t or F or ( m = > m . N om e )13 <di v >@H tml .Lab e lFo r (m => m.N u mero )</di v >14 @ H tm l . E di t or F or ( m = > m . N um e ro )15 <di v >@H tml .Lab e lFo r (m => m.A l tur a )< / di v >16 @ H tm l . E di t or F or ( m = > m . A lt u ra )1718 <di v ><in p ut ty pe ="submit" value ="Cadastrar" /></ di v >19 }

Código HTML 8.2: Cadastra.cshtml

Para ver o resultado, acesse a urlhttp://localhost:<PORTA_APP>/Jogador/Cadastra .

7 Altere a ação Cadastra do controlador Jogador. Aplique algumas regras de validação.1 ...2 [ H t tp P os t ]3 public A c t io n Resu l t Cad as t r a ( Jo gad o r j )4 {5 if (Str ing . IsNullOrEmpty( j .Nome))6 {7 M od el St at e .A dd Mo de lE rr or ( "Nome",8 " O n om e d o j o ga d or é o b ri g at ó ri o " ) ;9 }

1 if ( j .N u mero == null | | j . N u me r o < = | | j . N u me r o > = 1 )11 {12 M od el St at e . Ad dM od el Er ro r ( "Numero",13 " O nú m er o do j og a do r d ev e se r ma i or q ue e m e no r qu e 1 " ) ;14 }15 if ( j .A l tur a == null | | j . A l tu r a < )16 {17 M od el St at e . Ad dM od el Er ro r ( "Altura" ,18 " A a l tu r a d o j o ga d or nã o p od e s er n eg a ti v a " ) ;19 }221 if (ModelState . I sValid)22 {23 K19Context ctx = ne w K19Context( ) ;24 c tx . Jo ga do re s .A dd (j );25 c tx . Sa ve Ch an ge s () ;26 return RedirectToAction( "Lis ta" ) ;27 }28 else29 {

3 return View( "Cadastra" , j ) ;31 }32 }

www.facebook.com/k19treinamentos 147

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 158/244

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 159/244

149 V ALIDAÇÃO

Com essa anotação, a lógica de validação pode ser retirada do controlador Editora .

1 ...2 [ H t tp P os t ]3 public A c t io n Resu l t Sa lva (Ed i to ra ed i to r a )4 {5 if (ModelState . I sValid)6 {7 db .Editoras .Add (editora );8 return RedirectToAction( "Index" ) ;9 }

1 else11 {12 return View( "Cadastra" , ed i to r a ) ;13 }14 }15 ...

Código C# 8.9: EditoraController.cs

Alterando a mensagem

As anotações de validação possuem mensagens padrão que podem ser alteradas através do atri-buto ErrorMessage .

1 ...2 [Req u ir ed (Er ro rMessag e= " O c am p o N om e é o b ri g at ó ri o " ) ]3 public s tr ing N o me { ge t ; se t ; }4 ...

Outros validadores

Há outras anotações para validação:

• Range

• ReqularExpression

• StringLength

Validação no lado do Cliente

As validações podem ser realizadas também nos navegadores para melhorar a interação com osusuários.

Antes da terceira versão do ASP.NET MVC, era necessário habilitar a validação no lado do clienteatravés do método Html.EnableClientValidation() . A partir da terceira versão do ASP.NET MVC,a validação no cliente está habilitada por padrão.

Para que a validação no lado cliente funcione corretamente, devemos acrescentar as bibliotecas javascript necessárias. No ASP.NET MVC 4, basta acrescentar a seção de scripts nas páginas.

1 @ s ec t io n S c ri p ts {2 @ Sc ri pt s . Re nd er ( "~/bundles / jqueryval" )3 }

www.facebook.com/k19treinamentos 149

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 160/244

V ALIDAÇÃO 150

Exercícios de Fixação

9 Altere a entidade Jogador acrescentando as anotações de validação.

1 namespace Validacao .Models2 {3 p u b lic c las s Jogador4 {5 [ Hi dd en In pu t( D is pl ay Va lu e = false ) ]6 p u b lic in t Jo g ad or ID { ge t ; se t ; }78 [ Re qu ir ed ( Er ro rM es sa ge = " O n om e d o j o ga d or é o b ri g at ó ri o " ) ]9 public s tr ing N o me { ge t ; se t ; }

111 [ Re qu ir ed ( Er ro rM es sa ge = " O n ú me ro d o j o ga d or é o b ri g at ó ri o " ) ]12 [ Range (1 , 99 ,13 ErrorMessage = " O n ú me r o d o j o ga d or d ev e s er m a io r q ue e m e no r q ue 1 " ) ]14 p u b lic in t ? N um e ro { ge t ; se t ; }1516 [ Re qu ir ed ( Er ro rM es sa ge = " A a l tu ra d o j o ga d or é o b ri g at ó ri a " ) ]17 [ Range ( , double .MaxValue ,18 ErrorMessage = " A a l tu r a d o j o ga d or n ão p od e s er n e ga t iv a " ) ]19 public double ? A lt ur a { ge t ; se t ; }2 }21 }

Código C# 8.11: Jogador.cs

10 Altere a ação Cadastra do controlador Jogador.1 ...2 [ H t tp P os t ]3 public A c t io n Resu l t Cad as t r a ( Jo gad o r j )4 {5 if (ModelState . I sValid)6 {7 K19Context ctx = ne w K19Context( ) ;8 c tx . Jo ga do re s .A dd (j );9 ctx .S av eC ha ng es () ;

1 return RedirectToAction( "Lis ta" ) ;11 }12 else13 {14 return View( "Cadastra" , j ) ;15 }16 }17 ...

Código C# 8.12: JogadorController.cs

Importante: Apague a base de dados Validacao.Models.K19Context

Para ver o resultado, acesse a urlhttp://localhost:<PORTA_APP>/Jogador/Cadastra .

11 Para adicionar a validação no lado do cliente, basta alterar a página de cadastro de jogadores.

Observe o código abaixo.

150 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 161/244

151 V ALIDAÇÃO

1 @mo del Va l id acao .Mod e ls . Jo gad o r23 @{4 Vie wB ag . Ti tl e = "Cadastra" ;5 }

67 <h2 >Cadastra</ h2 >89 @u s in g (H tml .Begin Form( ) )

1 {11 @ Ht ml . Val id at io nS um ma ry ( t ru e )1213 <di v >@H tml .Lab e lFo r (m => m.N o me)</di v >14 @ H tm l . E di t or F or ( m = > m . N om e )15 @ Ht ml . Val id at io nM es sa ge Fo r (m = > m . No me )1617 <di v >@H tml .Lab e lFo r (m => m.N u mero )</di v >18 @ H tm l . E di t or F or ( m = > m . N um e ro )19 @ Ht ml . Val id at io nM es sa ge Fo r (m = > m . Nu me ro )221 <di v >@H tml .Lab e lFo r (m => m.A l tur a )< / di v >22 @ H tm l . E di t or F or ( m = > m . A lt u ra )23 @ Ht ml . Val id at io nM es sa ge Fo r (m = > m . Al tu ra )2425 <di v ><in p ut ty pe ="submit" value ="Cadastrar" /></ di v >2627 @ s ec t io n S c ri p ts {28 @ Sc ri pt s . Re nd er ( "~/bundles / jqueryval" )29 }3 }

Código CSHTML 8.5: Cadastra.cshtml

Para testar, acesse a urlhttp://localhost:<PORTA_APP>/Jogador/Cadastra .

www.facebook.com/k19treinamentos 151

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 162/244

V ALIDAÇÃO 152

152 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 163/244

SESSÃO

C A P

Í T U L O

9Considere a aplicação de uma loja virtual. Nessa aplicação, os clientes selecionam os produtos

desejados e os adiciona no seucarrinho de compra. Cadacliente deve ter o seu própriocarrinho paraqueos seusprodutos nãose misturem comos produtos selecionados poroutrosclientes. A aplicaçãodeve armazenar o carrinho de um cliente até que a compra seja nalizada ou até ela ter certeza queo cliente não precisa mais do carrinho.

Para resolver esse problema, podemos utilizar o conceito de Sessão. Para cada navegador co-nectado, o servidor manterá uma sessão aberta. Dessa forma, podemos separar os dados de cadausuário conectado.

Identicando os navegadores

Para aplicar a ideia de Sessão, é necessário ter a capacidade de identicar o navegador que estárequisitando a aplicação a cada requisição. Uma primeira abordagem seria utilizar o endereço IP damáquinas para identicar os navegadores. Porém, nessa abordagem, dois navegadores executandona mesma máquina não poderiam ser identicados individualmente.

Outra abordagem é deixar a cargo do servidor a criação de um identicador único para cadanavegador conectado. Quando um navegador faz a primeira requisição para a aplicação, o servi-dor deve gerar um identicador único para esse navegador e enviá-lo na resposta HTTP. A partir dasegunda requisição, os navegadores devem enviar para a aplicação o identicador recebido na pri-meira requisição. Desta maneira, a aplicação saberá qual é o navegador que está realizando umarequisição. Os navegadores podem enviar os seus respectivos identicadores de diferentes formas. As mais utilizadas são:

Reescrita de URL Nesta abordagem, os identicadores sãoembutidosnoslinks e botõesdaspáginasda aplicação. Quando os links ou botões são clicados pelo usuário, o identicador é enviadopara a aplicação. Uma desvantagem é que todas as páginas devem ser geradas dinamicamentepara adicionar o identicador em todos os links e botões.

Cookies Cookies são arquivos contendo informações. Eles são gerados nos servidores e enviadospara os navegadores. Os navegadores armazenamos cookies localmente na máquina do usuá-rio. Além disso, os navegadores enviam os cookies de volta para o servidor em todas as requi-sições. Os servidores podem armazenar os identicadores gerados em cookies. Dessa forma, acada requisição, o servidor receberá um cookie contendo o identicador.

Sessões no ASP.NET MVC

www.facebook.com/k19treinamentos 153

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 164/244

SESSÃO 154

No ASP.NET MVC, o objeto que representa uma sessão é um dicionário. Para armazenar infor-mações, você deve adicionar uma chave e um valor na propriedade Session . Considere um objetoda 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 dousuário.

1 p u b l ic c lass Lo g in Co n tro l ler : Co n t ro l ler2 {3 ...4 public A c t io n Resu l t Lo gin (Cl iente c l ien te )5 {6 ...7 Sess ion [ "Clien te" ] = c l ie n te ;8 ...9 }

1 }

Código C# 9.1: LonginController.cs

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 exem-plo a seguir:

1 Cl ien te c l ien te = (Cl iente )Sess io n [ "Clien te" ];2 str ing sau d acao = " B em v in d o " + c l ien te .N o me;

Código C# 9.2: Recuperando informações da sessão

Quando um usuário deslogar, podemos eliminar a informação armazenada em sua sessão. Paraisso, podemos simplesmente remover todas as chaves do dicionário como no exemplo a seguir.

1 Sessio n .Remov eA l l ( ) ;

Código C# 9.3: Eliminando todas as informações da sessão

Contudo, o método RemoveAll() não elimina a sessão. Ele apenas remove os dados contidos nasessão. Para eliminá-la, você deve utilizar o método Abandon() . Observe o exemplo a seguir.

1 p u b l ic c lass Lo g in Co n tro l ler : Co n t ro l ler2 {3 ...4 public ActionResult Logout( )5 {6 ...7 Se ss io n. Ab an do n() ;8 ...9 }

1 }

Código C# 9.4: LoginController.cs

Session Mode

O ASP.NET MVC disponibiliza quatro modos de sessão (Session Modes ):

• InProc

154 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 165/244

155 SESSÃO

• StateServer

• SQLServer

• Custom

A diferença entre eles é o modo de armazenamento das sessões.

Nomodo InProc , todas as informações da sessãosãoarmazenadas na memória do servidor. Esseé o modo mais simples e mais utilizado, e vem congurado como o padrão. Uma desvantagem dessemodo é a possível sobrecarga de memória se forem armazenadas muitas informações na sessão. Porisso nãoé indicado para sistemas muito grandes, commuitosusuáriosnavegandosimultaneamente.Outroproblema é queo servidor da aplicaçãonãopode serdesligado, pois a informação armazenadana memória será perdida.

No modo StateServer , as informações são serializadas e enviadas para um servidor indepen-dente do servidor da aplicação. Isto possibilita que o servidor de aplicação possa ser reiniciado semque as sessões sejam perdidas. Uma desvantagem é o tempo gasto para realizar a serialização e des-serialização.

No modo SQLServer , as informações também são serializadas, mas são armazenadas em umbanco de dados. Além de permitir que o servidor da aplicação seja reiniciado, este modo possibi-lita um maior controle de segurança dos dados da sessão. Uma desvantagem importante é que oprocesso é naturalmente lento.

No modo Custom, todo o processo de identicação de usuários e armazenamento de sessõespode ser personalizado.

Para selecionar algum dos modos disponíveis, basta adicionar a tag <sessionState> dentro datag <system.web> , no arquivo Web.Config da raiz de um projeto ASP.NET MVC 4.

1 <sess io n S tate mo de= "InProc" />

Código XML 9.1: Web.Cong

Podemos personalizar nossa sessão, modicando alguns atributos da tag <sessionState> . Porexemplo, podemos determinar o tempo de timeout das sessões. Veja o exemplo abaixo.

1 <sess io n S tate mo de= "InProc" t imeout= "3 " />

Código XML 9.2: Web.Cong

Outra possibilidade é desabilitar o uso de cookie com o atributo cookieless . Neste caso seráutilizada a reescrita de URL.

1 <sess io n S tate mo de= "InProc" cookieless= "true" />

Código XML 9.3: Web.Cong

Exercícios de Fixação

www.facebook.com/k19treinamentos 155

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 166/244

SESSÃO 156

1 Crie um projeto do tipo ASP.NET MVC 4 Web Application chamado Sessao no Visual Studio2012 Express for Web. Utilize o template Basic Project.

2 Adicione uma entidade chamada Produto na pasta Models do projeto Sessao.1 namespace Sessao .Models2 {3 p u b lic c las s Produto4 {5 p u b lic in t P ro d u to ID { ge t ; se t ; }6 public s tr ing N o me { ge t ; se t ; }7 public double P reco { ge t ; se t ; }8 }9 }

Código C# 9.5: Produto.cs

3 Adicione uma classe chamada K19Context na pasta Models para registrar a entidade Produtoe utilizar os recursos do Entity Framework. Lembre-se de fazer com que sua classe herde da classeDbContext.

1 namespace Sessao .Models2 {3 p u b lic c las s K19Context:DbContext4 {5 public DbSet<Produto > Produtos { ge t ; se t ; }6 }7 }

Código C# 9.6: K19Context.cs

4 Adicione uma classe chamada Carrinho na pasta Models do projeto Sessao.

1 namespace Sessao .Models2 {3 p u b lic c las s Carr inho4 {5 public Lis t<Produto > Produtos { ge t ; se t ; }67 public Carr inho()8 {9 this .P ro d uto s = ne w List< Produto >();

1 }11 }12 }

Código C# 9.7: Carrinho.cs

5 Adicione um controlador chamado Produto baseado na entidade Produto e no DbContextK19Context utilizando o recurso do scaffolding .

6 Altere a tela Index do controlador Produto de acordo com o código abaixo.

1 @mo del IEn u merab le<Sessao .Mo de ls .P ro du to >2

156 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 167/244

157 SESSÃO

3 @{4 ViewBag .Title = "Index" ;5 }67 <h2 >Index</ h2 >

89 @ if ( Te mp D at a [ "Mensagem"] ! = n ul l )1 {11 <di v >@TempData["Mensagem"]</ di v >12 }1314 <p >15 @Htm l. Ac ti onL in k( "Crea te N ew " , "Create" )16 < / p >17 <table >18 <tr >19 <th >2 @Html .Disp layNameFor (model => model .Nome )21 </ th >22 <th >23 @Html .Disp layNameFor (model => model .Preco )24 </ th >25 <th ></ th >26 </ tr >2728 @ f or e ac h ( v ar i te m i n M od e l ) {29 <tr >3 < td >31 @Html .Disp layFor (modelI tem => item .Nome )32 </ td >33 <td >34 @Html .Disp layFor (modelI tem => item .Preco )35 </ td >36 <td >37 @Html . ActionLink ( "Edit" , "Edit" , n ew { i d = it em . P r od u to I D } ) |38 @Html . ActionLink ( "Detai ls" , "Detai ls" , n ew { i d = it em . P r od u to I D } ) |39 @Html . ActionLink ( "Delete" , "Delete" , n ew { i d = it em . P r od u to I D } ) |4 @Html .ActionLink ( "A d ic ion ar ao ca r r in h o " , "Adicionar" , "Carr inho" , n e w { i d = ←

i t em.Pro d u toID } , n u ll )41 </ td >42 </ tr >43 }44 < / table >

Código CSHTML 9.1: Index.cshtml

7 Adicione um controlador chamado Carrinho utilizando o template EmptyMVCController. Emseguida altere-o de acordo com o código abaixo.

1 namespace Sessao .Contro l lers2 {3 p u b lic c las s Car r in h o Con t ro l le r : Co n t ro l le r4 {5 //6 / / G ET: /Car r inh o /78 public ActionResult Index()9 {

1 return View( this .PegaCarr inhoDaSessao() ) ;11 }1213 public ActionResult Cancelar ( )14 {15 Session .Abandon () ;

16 return RedirectToAction( "Index" , "Produto" ) ;17 }18

www.facebook.com/k19treinamentos 157

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 168/244

SESSÃO 158

19 public ActionResult Adicionar( in t i d = )2 {21 K19Context ctx = ne w K19Context( ) ;22 P ro du to p = ctx .P ro du to s. Find (id );23

24 if ( p = = null )25 {26 return HttpNotFound() ;27 }2829 Carr inho carr inho = this .PegaCarr inhoDaSessao() ;3 c arr in ho . Pr od ut os . Add (p );3132 TempData ["Mensagem"] = "P ro du to ad ic io n ad o ao ca r rin h o co m su cesso ! " ;3334 return RedirectToAction( "Index" , "Produto" ) ;35 }3637 public ActionResult Remover( in t i d x = )38 {39 Carr inho carr inho = this .PegaCarr inhoDaSessao() ;4 c ar ri nh o. Pr od ut os . Re mo ve At ( id x) ;4142 return RedirectToAction( "Index" ) ;43 }4445 pr ivate Carr inho PegaCarr inhoDaSessao()46 {47 if (Sess ion[ "Carr inho" ] == null )48 {49 Session [ "Carr inho" ] = ne w Carr inho() ;5 }5152 return Sess ion[ "Carr inho" ] as Carr inho;53 }54 }55 }

Código C# 9.8: CarrinhoController.cs

8 Adicione uma tela associada à ação Index do controlador Carrinho com o seguinte conteúdo.

1 @mo del Sessao .Mo d e ls .Car r inh o2 @{3 Vie wB ag . Ti tl e = "Index" ;4 }56 <h2 >Index</ h2 >7

8 @H tml .A c t io nLin k ( "Can cela r ca r rin h o " , "Cancelar" )91 < ul >11 @{12 int i = ;13 f or ea ch ( v ar p ro du to i n M od el . P ro du to s )14 {15 <li >@p ro du to .N o me (@p ro du to .P reco ) - @H tml .A c t io n Lin k ( "Remo ver d o ca r rin h o " ,16 "Remover" , n e w { i d x = i + + } ) < / li >17 }18 }19 < / ul >

Código CSHTML 9.2: Index.cshtml

9 Altere o layout _Layout de acordo com o código abaixo.

158 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 169/244

159 SESSÃO

1 @u s in g Sessao .Mo de ls ;2 <! D O CTY PE h tml>3 <html >4 <head >

5 <meta ch arse t ="utf -8" />6 <meta n ame="viewpor t" conten t ="width=device-width" / >7 <title >@ViewBag.Tit le</ title >8 @Styles .Render ( "~/Content/css" )9 @S cri pt s. Re nde r( "~/bundles /modern izr" )

1 < / head >11 <body >12 <di v >13 @{14 Carrinho car rinho = Sess ion [ "Carr inho" ] a s C a rr i nh o ;1516 if ( car rinho != null ){17 @Html . ActionLink ( "Meu ca r r in h o ( " + @carr in h o .P rod u tos .Co u n t + " p ro du to s ) " ,18 "Index" , "Carr inho" )19 }2 }

21 </ di v >22 @RenderBody ()2324 @S cri pt s. Re nde r( "~/bundles / jquery" )25 @ Re nde rS ect io n( "scr ip ts" , r eq ui r ed : f a l se )26 < / body >27 < / html >

Código CSHTML 9.3: _Layout.cshtml

www.facebook.com/k19treinamentos 159

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 170/244

SESSÃO 160

160 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 171/244

FILTROS

C A P

Í T U L O

10Muitas vezes,queremos restringir o acessoà determinadasáreasde umaaplicação, sejaporques-

tões de segurança ou por organização. Em nossa aplicação poderíamos, por exemplo, denir quepara poder adicionar, alterar e remover editoras, o usuário deve estar logado no sistema. Caso con-trário, o usuário apenas poderá listar as editoras.

1 ...2 public ActionResult Cadastra( )3 {4 if (Sess ion[ "Clien te" ] != null )5 {6 r e turn b ase .View() ;7 }8 else9 {

1 r e turn b ase .RedirectToAction( "Index" , "Login" ) ;11 }12 }13 ...

Código C# 10.1: EditoraController.cs

No exemplo acima, caso um usuário tente adicionar uma editora através do formulário de ca-dastro, a ação Cadastra vericará se o usuário já está logado. Essa vericação é realizada atravésdo uso da sessão, como visto no capítulo 9. Se o usuário não estiver logado, ele será redirecionadopara a página de Login. Apesar de funcionar, este código apresenta uma inconveniência. Temos queadicionar essa lógica em todas as ações que queremos que tenha o mesmo comportamento, ou seja,que apenas permitam o acesso de usuários logados.

Em outros casos, podemos desejar que algumas ações executem alguma tarefa em comum. Por

exemplo, poderíamos adicionar uma mensagem em um arquivo de logging sempre que uma açãofosse executada. Desse modo, poderíamos guardar um histórico sobre o que a aplicaçãomais execu-tou, qual foi a página mais visitada, etc. Mas novamente, teríamos que adicionar a mesma tarefa emtodas as ações da nossa aplicação.

Nesses casos, em que várias ações possuem um comportamento em comum, podemos utilizar oconceito de ltros . Um ltro é semelhante a um método que é executado antes ou depois de umaação.

Tipos de Filtros

O ASP.NET MVC possui 4 (quatro) tipos de ltros:

www.facebook.com/k19treinamentos 161

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 172/244

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 173/244

163 FILTROS

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 4 1 HTTP status . Se a aplicação estivercongurada para utilizar ASP .NET Forms Authentication , o usuário será redirecionado para umapágina de login.

Importante Ao criar um projeto ASP.NET MVC utilizando o template Basic Project , a aplicaçãoé congurada para utilizar oASP.NET Forms Authentication automaticamente.

Para o nosso primeiro exemplo, podemos utilizar o ltro de autorização, onde exigimos que ousuário esteja logado (autenticado) para acessar determinadas áreas da aplicação. Para isso, preci-samos adicionar o seguinte código no nosso método de login:

1 ...2 FormsAuthenticat ion .SetAuthCookie( usuar io .Username , false ) ;3 ...

Código C# 10.3: AutenticadorController.cs

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 identique). O segundo parâmetro é um booleano re-lativo ao tipo do cookie, se é permanente ou não. Caso seja true , ele sempre irá considerar que ousuá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:

1 ...2 Fo rmsAu th en tica t io n .S ig n O ut ( ) ;3 ...

Código C# 10.4: AutenticadorController.cs

As ações que devem utilizar o ltro de autorização devem ser anotadas com Authorize .

1 ...2 [A u th or ize ]3 public ActionResult Cadastra( )4 {

5 r e turn b ase .View() ;6 }7 ...

Código C# 10.5: EditoraController.cs

Se queremos aplicar o mesmo ltro a todas as ações de um controlador, podemos adicionar aanotação Authorize na classe.

1 [A u th or ize ]2 p u b l ic c lass Ed i to r aCon t ro l le r : Co n tro l ler3 {4 ...5 }

Código C# 10.6: EditoraController.cs

www.facebook.com/k19treinamentos 163

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 174/244

FILTROS 164

Desse modo, todas as ações presentes no controlador da Editora exigem que o usuário estejaautenticado.

Quandoo ltro de autorização “barra” um usuário de acessar umapágina, podemos redirecioná-lo para a página de login. Devemos incluir o seguintecódigo dentro da tag<system.web> do arquivoWeb.Config .

1 <au th ent ica t io n mo de= "Forms" >2 < fo rm s l og in Ur l = "~/Autenticador /Formular io" t imeout= "288 " / >3 < /au th en t icat io n >

Código XML 10.1: Web.Cong

Através da propriedade User , podemos obter o usuário associado a requisição atual. As infor-mações do usuário podem ser obtidas através da propriedade Identity . Por exemplo, podemosvericar se o usuário associado à requisição atual está autenticado, basta utilizar a propriedade

IsAuthenticated da propriedade Identity :1 if (User. Identi ty. IsAuthenticated)2 {3 ...4 }

Código C# 10.7: Vericando se o usuário está autenticado

Para obter o nome do usuário autenticado, podemos utilizar a propriedade Name da propriedadeIdentity :

1 string n o me = U ser. I d en t ity.N ame;

Código C# 10.8: Vericando quem é o usuário autenticado

A propriedade Name retorna o nome do usuário que passamos como parâmetro para o métodoSetAuthCookie na autenticação.

Exercícios de Fixação

1 Crie um projeto do tipo ASP.NET MVC 4 Web Application chamado Filtros no Visual Studio2012 Express for Web. Utilize o template Basic Project.

2 Adicione uma entidade chamada Produto na pasta Models do projeto Filtros.

1 namespace Fil t ros .Models2 {3 p u b lic c las s Produto4 {5 p u b lic in t P ro d u to ID { ge t ; se t ; }6 public s tr ing N o me { ge t ; se t ; }7 public double P reco { ge t ; se t ; }8 }9 }

Código C# 10.9: Produto.cs

164 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 175/244

165 FILTROS

3 Adicione uma classe chamada K19Context na pasta Models para registrar a entidade Produtoe utilizar os recursos do Entity Framework. Lembre-se de fazer com que sua classe herde da classeDbContext.

1 namespace Fil t ros .Models2 {3 p u b lic c las s K19Context:DbContext4 {5 public DbSet<Produto > Produtos { ge t ; se t ; }6 }7 }

Código C# 10.10: K19Context.cs

4 Adicione uma classe Usuario na pasta Models.

1 using System.ComponentModel .DataAnnotat ions;23 namespace Fil t ros .Models4 {5 p u b lic c las s Usuar io6 {7 public s tr ing U sername { ge t ; se t ; }8 [ D at aTyp e ( Da ta Ty pe . P as sw or d )]9 public s tr ing Passwo rd { ge t ; se t ; }

1 }11 }

Código C# 10.11: Usuario.cs

5 Adicione o controlador Autenticador para permitir a autenticação do usuário.

1 using System;2 using System.Collect ions .Gener ic;3 using System.Linq;4 using System.Web;5 using System.Web.Mvc;6 using System.Web.Secur i ty ;7 using Fil t ros .Models ;89 namespace Fil t ros .Contro l lers

1 {11 p u b lic c las s A u ten ticad o rCo n t ro l le r : Co n t ro l ler12 {1314 public ActionResult Formular io( )15 {16 return View() ;17 }1819 public A c t ion Resul t En t ra r (U su ario u su ar io )2 {21 if ( u su ar io .U sern ame != null && u su ar io .Passw o rd != null &&22 usuar io .Username .Equals ( "K19") && u su ar io .Passw o rd .Eq ua ls ( "K19") )23 {2425 Session [ "Usuar io" ] = u s ua r io ;26 return RedirectToAction( "Index" , "Produto" ) ;27 }28 else

29 {3 ViewBag . Mensagem = "u su ár io o u senh a in co rr e to s" ;31 return View( "Formular io" ) ;

www.facebook.com/k19treinamentos 165

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 176/244

FILTROS 166

32 }33 }3435 public ActionResult Sair ( )36 {

37 Session .Abandon () ;38 return RedirectToAction( "Formular io" ) ;39 }4 }41 }

Código C# 10.12: AutenticadorController.cs

1 @mo del F i l tr o s .Mo d els .U su ario23 @{4 ViewBag .Title = "Formular io" ;5 }67 <h2 >Login</ h2 >89 @u s in g ( H tml .Beg in Form( "Entrar" , "Autenticador" ) )

1 {11 @ Ht ml . Val id at io nS um ma ry ( t ru e )1213 <f ieldset >14 <legend >Usuar io</ legend >1516 <d iv c las s ="editor- label" >17 @Html .LabelFor (model => model .Username )18 </ di v >19 <d iv c las s ="editor- f ie ld" >2 @Html .EditorFor (model = > model .Username )21 @ Html . Val id at io nM es sa ge For ( mode l = > mode l. Us er na me )22 </ di v >

2324 <d iv c las s ="editor- label" >25 @Html .LabelFor (model => model .Password )26 </ di v >27 <d iv c las s ="editor- f ie ld" >28 @Html .EditorFor (model = > model .Password )29 @ Html . Val id at io nM es sa ge For ( mode l = > mode l. Pa ss wo rd )3 </ di v >3132 <p >33 <in pu t ty pe ="submit" value ="Logar" / >34 </ p >35 </ f ieldset >36 }3738 <di v >

39 @Htm l. Ac ti onL in k( " B a ck t o L is t " , "Index" )4 < / di v >4142 @sect io n Scr ip t s {43 @S cri pt s. Re nde r( "~/bundles / jqueryval" )44 }

Código CSHTML 10.1: Formulario.cshtml

6 Adicione um controlador para cadastrar um produto e listar os produtos. Altere o controladorpara permitir que apenas os usuários logados possam cadastrar os produtos.

1 namespace Fil t ros .Contro l lers2 {3 p u b lic c las s P ro d u to Co nt ro l le r : Co n t ro l ler

166 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 177/244

167 FILTROS

4 {5 pr ivate K 1 9 Co n tex t d b = ne w K19Context( ) ;67 public ActionResult Index()8 {

9 return View(db.Produtos .ToLis t( ) ) ;1 }1112 public ActionResult Cadastrar ( )13 {14 if (Sess ion[ "Usuar io" ] != null )15 {16 return View() ;17 }18 else19 {2 TempData [ "Mensagem"] = "A cesso n ão p e rmi t id o " ;21 return RedirectToAction( "Index" ) ;22 }2324 }2526 [ HttpPost ]27 public A c t ion Resul t Cad as t r a r (P rod u to p ro du to )28 {29 if (ModelState . I sValid)3 {31 db .Produtos .Add (produto );32 db . SaveChanges () ;33 return RedirectToAction( "Index" ) ;34 }35 return View(produto) ;36 }373839 }4 }

Código C# 10.13: ProdutoController.cs

1 @mo del IEn u merab le<F i l t r os .Mo d e ls .P rod u to >23 @{4 ViewBag .Title = "Index" ;5 }67 <h2 >Index</ h2 >8 @ if ( Te mp D at a [ "Mensagem"] ! = n u ll )9 {

1 < h3 >@TempData["Mensagem"]</ h3 >11 }12 <h3 ></ h3 >13 <p >14 @Htm l. Ac ti onL in k( "Cad as tr a r P ro du to " , "Cadastrar" )15 < / p >16 <table >17 <tr >18 <th >19 @Html .Disp layNameFor (model => model .Nome )2 </ th >21 <th >22 @Html .Disp layNameFor (model => model .Preco )23 </ th >24 <th ></ th >25 </ tr >26

27 @f ore ac h ( var item in Mode l)28 {29 <tr >

www.facebook.com/k19treinamentos 167

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 178/244

FILTROS 168

3 < td >31 @Html . Disp layFor (modelItem => item . Nome )32 </ td >33 <td >34 @Html . Disp layFor (modelItem => item . Preco )

35 </ td >3637 </ tr >38 }394 < / table >

Código CSHTML 10.2: Index.cshtml

1 @mo del F i l tr o s .Mo d els .P ro d uto23 @{4 ViewBag .Title = "Cadastrar" ;

5 }67 <h2 >Cadastrar</ h2 >89 @u s in g (H tml .Begin Form( ) )

1 {11 @ Ht ml . Val id at io nS um ma ry ( t ru e )1213 <f ieldset >14 <legend >Produto</ legend >1516 <d iv c las s ="editor- label" >17 @Html .LabelFor (model => model .Nome )18 </ di v >19 <d iv c las s ="editor- f ie ld" >2 @Html .EditorFor (model => model .Nome )21 @ Html . Val id at io nM es sa ge For ( mode l = > mode l. Nome )22 </ di v >2324 <d iv c las s ="editor- label" >25 @Html .LabelFor (model => model .Preco )26 </ di v >27 <d iv c las s ="editor- f ie ld" >28 @Html .EditorFor (model => model .Preco )29 @ Html . Val id at io nM es sa ge For ( mode l = > mode l. Pr eco )3 </ di v >3132 <p >33 <in pu t ty pe ="submit" value ="Create" />34 </ p >35 </ f ieldset >36 }3738 <di v >39 @Htm l. Ac ti onL in k( " B a ck t o L is t " , "Index" )4 < / di v >4142 @sect io n Scr ip t s {43 @S cri pt s. Re nde r( "~/bundles / jqueryval" )44 }

Código CSHTML 10.3: Cadastrar.cshtml

Para testar, acesse a url http://localhost:<PORTA_APP>/Produto/ e clique no link de cadas-

trar. Depoisacesse o endereçohttp://localhost:<PORTA_APP>/Autenticador/Formulario/ parafazer a autenticação através do usuário K19 e senha K19.

168 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 179/244

169 FILTROS

7 Ao invés de usar sessão, vamos utilizar o ltro de autorização do ASP.NET MVC. Primeiro, deve-mos alterar as ações Entrar e Sair do controlador Autenticador .

1 using Fil t ros .Models ;

2 using System;3 using System.Collect ions .Gener ic;4 using System.Linq;5 using System.Web;6 using System.Web.Mvc;7 using System.Web.Secur i ty ;89 namespace Fil t ros .Contro l lers

1 {11 p u b lic c las s A u ten ticad o rCo n t ro l le r : Co n t ro l ler12 {1314 public ActionResult Formular io( )15 {16 return View() ;17 }

1819 public A c t ion Resul t En t ra r (U su ario u su ar io )2 {21 if ( u su ar io .U sern ame != null && u su ar io .Passw o rd != null &&22 usuar io .Username .Equals ( "K19") && u su ar io .Passw o rd .Eq ua ls ( "K19") )23 {2425 F or ms Au th en ti ca ti on . S et Au th Co ok ie ( u su ar io . U se rn am e ,26 false ) ; return RedirectToAction( "Index" , "Produto" ) ;27 }28 else29 {3 ViewBag . Mensagem = "u su ár io o u senh a in co rr e to s" ;31 return View( "Formular io" ) ;32 }33 }3435 public ActionResult Sair ( )36 {37 F or ms Au th en ti ca ti on . Si gn Ou t () ;38 return RedirectToAction( "Formular io" ) ;39 }4 }41 }

Código C# 10.14: AutenticadorController.cs

8 Altere o controlador Produto para que somente usuários logados possam acessar o formulário

de cadastro.1 ...2 [ A u th o ri z e ]3 public ActionResult Cadastra( )4 {5 return View() ;6 }7 ...

Código C# 10.15: ProdutoController.cs

9 Adicione no arquivo Views/Shared/_Layout.cshtml um link para ação Sair.

1 <! D O CTY PE h tml>

www.facebook.com/k19treinamentos 169

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 180/244

FILTROS 170

2 <html >3 <head >4 <meta ch arse t ="utf -8" />5 <meta n ame="viewpor t" conten t ="width=device-width" />6 <title >@ViewBag.Tit le</ title >

7 @ St yl es . R en de r ( "~/Content/css" )8 @ Sc ri pt s . Re nd er ( "~/bundles /modern izr" )9 </ head >

1 < body >11 @ if ( U se r. I de n ti t y. I sA u th e nt i ca t ed )12 {13 @ : O lá @ Us e r. Id e nt i ty. N am e , @ Ht ml . A c ti o nL i nk ( "Sair" , "Sair" , "Autenticador" )14 }15 @ Re nd er Bo dy ( )1617 @ Sc ri pt s . Re nd er ( "~/bundles / jquery" )18 @ Re nd er Se ct io n ( "scr ip ts" , r eq u ir ed : f a l se )19 < / body >2 < / html >

Código CSHTML 10.4: _Layout.cshtml

10 Dena a url para a qual os usuários não logados serão redirecionados ao tentarem acessar oformulário de cadastro de editoras. Altere o arquivo Web.config da raiz do projeto Filtros.

1 ...2 <au th ent ica t io n mo de= "Forms" >3 < fo rm s l og in Ur l= "~/Autenticador /Formular io" t imeout= "288 " / >4 < /au th en t icat io n >5 ...

Código XML 10.2: Web.cong

Acesse o endereçohttp://localhost:<PORTA_APP>/Produto/Cadastra . Verique o funciona-mento do ltro de autorização que redirecionará os usuários que não estão logados para a url de-nida no arquivo Web.config .

Filtro de Ação

Os ltros de ação são executados antes ou depois de uma ação. Todos os ltros de ação de-vem implementar a interface IActionFilter . A interface IActionFilter contém dois métodosOnActionExecuted e OnActionExecuting .

1 public in ter face IActionFil ter2 {3 void OnActionExecuted(ActionExecutedContext f i l terContext) ;4 void OnActionExecuting(ActionExecutingContext f i l terContext) ;5 }

Código C# 10.16: IActionFilter.cs

Ométodo OnActionExecuting échamadoantesdaaçãoserexecutadaeométodo OnActionExecutedé chamado depoisdaação serexecutada. As classesActionExecutingContext e ActionExecutedContextsão derivadas da classe ControllerContext que provê acesso ao controlador e outras informações.

Através do ltro de ações podemos, por exemplo, salvar as informações das requisições numarquivo de log. Para isto, basta denirmos uma classe que implementa a interface IActionFilter :

170 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 181/244

171 FILTROS

1 p u b l ic c lass Lo g g in g F il te r : IA c t io n F i lte r2 {3 p r iva te s ta t ic st r ing f i l ename = "Requis icoesInfo . log" ;4

5 p r iva te s ta t ic st r ing logFilePath ;67 p u b lic v o id OnActionExecuted(ActionExecutedContext f i l terContext)8 {9

1 }1112 p u b lic v o id OnActionExecuting(ActionExecutingContext f i l terContext)13 {14 S av eI nf o ( fi lt er Co nt ex t );15 }1617 p r iva te v o id SaveInfo(Contro l lerContext contex t)18 {19 string in fo = S t r in g .Fo rmat ( " U s uá r io : { } , I P : { 1 } , D at a / H or a : { 2} , U rl : { 3} " ,2 c on te xt . H tt pC on te xt . Us er . I de nt it y. Na me ,

21 c o nt e xt . H t t pC o nt e xt . R e qu e st . U s er H os t Ad d re s s ,22 DateTime .Now ,23 c on te xt . H tt pC on te xt . R eq ue st . R aw Ur l );24 v ar p at h = G et Lo gF il eP at h ( co nt ex t );25 using (v ar lo g Wr i te r = ne w StreamWriter (path , true ) )26 {27 l og Wr it er . Wr it eL in e( in fo );28 }29 }331 p r iva te s ta t ic st r ing GetLogFilePath(Contro l lerContext contex t)32 {33 if (LoggingFil ter. logFilePath == null )34 {35 v ar l og Pa th = c on te xt . H tt pC on te xt . S er ve r . Ma pP at h ( "~/Logs" ) ;36 if ( !Directory.Exis ts( logPath))37 {38 D ir ec to ry . Cr ea te Di re ct or y( lo gP at h) ;39 }4 va r p at h = P at h. Co mb in e( lo gP at h , f il en am e) ;41 L og gi ng Fi lt er . lo gF il eP at h = p at h;42 }43 return LoggingFil ter. logFilePath ;44 }45 }

Código C# 10.17: LoggingFilter.cs

Para aplicar o ltro a todos os controladores e todas ações, basta deni-lo como global . Para de-nir LoggingFilter como global, basta adicioná-lo à coleção de ltros globais do método Register-GlobalFilters da classe FilterConfig .

1 p u b l ic c lass Fil terConf ig2 {3 p u b lic s ta t ic v o id Regis terGlobalFil ters(GlobalFil terCollect ion f i l ters)4 {5 fi lters .Add ( ne w HandleErrorAttr ibu te( ) ) ;6 fi lters .Add ( ne w LoggingFil ter ( ) ) ;7 }8 }

Código C# 10.18: FilterCong.cs

Exercícios de Fixação

www.facebook.com/k19treinamentos 171

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 182/244

FILTROS 172

11 Adicione uma pasta Filters ao projeto Filtros.

12 Crie um ltro de ação para registrar num arquivo de log as informações da requisição.1 namespace Fil t ros .Fil ters2 {3 p u b lic c las s Lo g g in g F il te r : IA c t io n F i lte r4 {5 p r iva te s ta tic s t r in g f i l ename = "Requis icoesInfo . log" ;67 p r iva te s ta tic s t r in g logFilePath ;89 p u b lic v o id OnActionExecuted(ActionExecutedContext f i l terContext)

1 {1112 }1314 p u b lic v o id OnActionExecuting(ActionExecutingContext f i l terContext)15 {16 S ave In fo ( fil te rC on tex t) ;17 }1819 p r iva te v o id SaveInfo(Contro l lerContext contex t)2 {21 string in fo = S t r in g .Fo rmat ( " U s uá r io : { } , I P : { 1 } , D at a / Ho ra : { 2} , U rl : { 3} " ,22 c on te xt . Ht tp Co nt ex t .U se r. Id en ti ty . Name ,23 c on te xt . H tt pC on te xt . R eq ue st . U se rH os tA dd re ss ,24 DateTime .Now ,25 c on te xt . Ht tp Co nt ex t .R eq ue st . Ra wU rl ) ;26 va r p at h = G et Lo gF il eP at h (c on te xt ) ;27 using (v a r lo g Wr i te r = ne w StreamWriter (path , true ) )28 {29 logWriter .WriteLine (info );

3 }31 }32

172 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 183/244

173 FILTROS

33 p r iva te s ta tic s t r in g GetLogFilePath(Contro l lerContext contex t)34 {35 if (LoggingFil ter. logFilePath == null )36 {37 v ar l og Pa th = c on te xt . Ht tp Co nt ex t. Se rv er . Ma pP at h( "~/Logs" ) ;

38 if ( !Directory.Exis ts( logPath))39 {4 D ire cto ry . Cr ea te Di rec to ry ( log Pa th );41 }42 var path = Path .C om bi ne ( logPath , f ile na me );43 L og gi ng Fi lt er . lo gF il eP at h = path ;44 }45 return LoggingFil ter. logFilePath ;46 }47 }48 }

Código C# 10.19: LoggingFilter.cs

13 Dena o ltro de ação criado no exercício anterior como global, para que ele seja aplicado atodos os controladores e ações.

1 namespace Fil t ros2 {3 p u b lic c las s Fil terConf ig4 {5 p u b lic s ta tic v o id Regis terGlobalFil ters(GlobalFil terCollect ion f i l ters)6 {7 f il ters .Add ( ne w HandleErrorAttr ibu te( ) ) ;8 f ilters . Add ( ne w LoggingFil ter ( ) ) ;9 }

1 }11 }

Código C# 10.20: FilterCong.cs

Acesse os seguintes endereços:

http://localhost:<PORTA_APP>/Produto

http://localhost:<PORTA_APP>/Autenticador/Entrar

http://localhost:<PORTA_APP>/Produto/Cadastrar

Faça a autenticação com o username K19 e password K19.

E verique, posteriormente, que as informações das requisições foram salvas no arquivo Requi-sicoesInfo.log dentro do diretório Logs.

www.facebook.com/k19treinamentos 173

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 184/244

FILTROS 174

Filtro de Resultado

O ltro de resultado é executado antes ou depois do resultado da ação ser gerado. O resultadoda ação pode ser um JSON, uma página HTML ou qualquer outro resultado que derive da classeActionResult . Para denir um ltro de resultado, devemos implementar a interface IResultFilterque contém dois métodos OnResultExecuted e OnResultExecuting .

1 public in ter face IResultFil ter2 {3 void OnResultExecuted(ResultExecutedContext f i l terContext) ;4 void OnResultExecuting(ResultExecutingContext f i l terContext) ;5 }

Código C# 10.21: IResultFilter.cs

O método OnResultExecuting é executado antes do resultado ser gerado e o métodoOnResult-Executed é executado depois. As classes ResultExecutingContext e ResultExecutedContext sãoderivadas de ControllerContext , logo temos acesso ao controlador e às informações da requisição.

Atravésdo ltro de resultado,podemos, por exemplo, mensurar o tempo entre a execução de umaação e a geração do resultado. Para isto, podemos criar uma classe que é derivada de ActionFilter-Attribute .

Importante A classe ActionFilterAttribute é uma implementação padrão das interfaces

174 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 185/244

175 FILTROS

IActionFilter e IResultFilter , facilitando a criação de ltros que dependem daexecução da ação e do resultado.

1 p u b l ic c lass ElapsedTimeAttr ibu te : ActionFil terAttr ibu te2 {3 pr ivate Stopwatch durat ion ;4 p u b lic o ver r id e v oid OnActionExecuting(ActionExecutingContext f i l terContext)5 {6 this . d u ra t io n = S to pw atch .S tar tN ew ( ) ;7 }89 p u b lic o ver r id e v oid OnResultExecuted(ResultExecutedContext f i l terContext)

1 {11 this .durat ion .Stop() ;12 string i n fo = string .Format( "D u ração to tal : { } ms" , durat ion .ElapsedMill iseconds ←

) ;

13 f i lt e rC o nt e xt . H t t pC o nt e xt . R e sp o ns e . Wri t e ( in fo ) ;14 }15 }

Código C# 10.22: ElapsedTimeAttribute.cs

Para aplicar o ltro, basta adicionar a anotação ElapsedTime no controlador ou na ação.

1 ...23 [ El ap se dT im e ]4 public ActionResult Index()5 {6 return View(db.Produtos .ToLis t( ) ) ;7 }89 ...

Código C# 10.23: ProdutoController.cs

Ao acessar o seguinte endereço http://localhost:<PORTA_APP>/produto , podemos visualizara duração entre a execução da ação e a geração do resultado.

www.facebook.com/k19treinamentos 175

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 186/244

FILTROS 176

Exercícios de Fixação

14 Adicione ao projeto Filtros um ltro para medir o tempo entre a execução de uma ação e ageração do resultado. Dica: Utilize a classe ActionFilterAttribute para criar o ltro.

1 namespace Fil t ros .Fil ters2 {3 p u b lic c las s ElapsedTimeAttr ibu te : ActionFil terAttr ibu te4 {5 pr ivate S to p w atch d u rat io n ;6 p u b lic o v err id e v o id OnActionExecuting(ActionExecutingContext f i l terContext)7 {8 this . d u ra tio n = S to p watch .S ta rtN ew ( ) ;9 }

1

11 p u b lic o v err id e v o id OnResultExecuted(ResultExecutedContext f i l terContext)12 {13 this .durat ion .Stop() ;14 string i n fo = string .Format( "D u ração to ta l : { } ms" , d u rat io n . ←

ElapsedMill iseconds) ;15 f il te rC on te xt . H tt pC on te xt . R es po ns e . Wr it e (i nf o );16 }17 }18 }

Código C# 10.24: ElapsedTimeAttribute.cs

15 Adicione o ltro ElapsedTimeAttribute à ação Index do controlador Produto . Para adicionaro ltro, basta acrescentar a anotação [ElapsedTime] .

1 p u b l ic c lass P ro d u to Con t ro l le r : Co n tro l ler2 {3 ...45 [ El ap se dT im e ]6 public ActionResult Index()7 {8 return View(db.Produtos .ToLis t( ) ) ;9

1 }1112 ...

1314 }

Código C# 10.25: ProdutoController.cs

Acesse o seguinte endereço: http://localhost:<PORTA_APP>/produto . Verique que a dura-ção do tempo entre a execução da ação e a geração do resultado é mostrada na tela.

Filtro de Exceção

Os ltros de exceção são executados quando ocorrem exceções nas ações ou nos ltros. Os ltrosde exceção devem implementar a interface IExceptionFilter .

176 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 187/244

177 FILTROS

1 public in ter face IExceptionFil ter2 {3 void OnException(ExceptionContext f i l terContext) ;4 }

Código C# 10.26: IExceptionFilter.cs

O ASP .NET MVC contém a classe HandleErrorAttribute que é uma implementação padrãode IExceptionFilter . O ltro HandleErrorAttribute retorna a página Error localizada na pastaViews/Shared quando ocorre uma exceção. Através da HandleErrorAttribute podemos alterar apágina de erro retornada de acordo com o tipo de exceção.

1 [H an d leEr ro r (Ex cep t io nTy p e= typeof ( InvalidOperat ionException) ,2 View ="OperacaoInvalida" ) ]3 [H an d leEr ro r ]4 public ActionResult Index()5 {

6 return View(db.Produtos .ToLis t( ) ) ;7 }

Código C# 10.27: ProdutoController.cs

No exemplo acima, a primeira anotação ltrará os erros do tipo InvalidOperationExceptione retornará a página OperacaoInvalida da pasta Views/Shared . A segunda anotação ltrará todasas exceções e retornará a página padrão Error da pasta Views/Shared . É necessário habilitar o ele-mento customErrors no arquivo Web.cong para o ltro HandleErrorAttribute funcionar.

Exercícios de Fixação

16 Altere o controlador Produto do projeto Filtros. Acrescente uma ação para visualizar um pro-duto de uma lista através de uma posição. A ação deverá receber como parâmetro a posição, queserá denida pelo usuário através da url.

1 public ActionResult Visualizar ( in t posicao)2 {3 L is t < P ro du to > p r od u to s = d b . Pr o du t os . To Li s t () ;4 return View(produtos[posicao]) ;5 }

Código C# 10.28: ProdutoController.cs

17 Dena uma página para mostrar os dados do produto que foi selecionado de acordo com aposição.

1 @mo del F i l tr o s .Mo d els .P ro d uto23 @{4 Vie wB ag . Ti tl e = "Visualizar" ;5 }67 <h2 >Visualizar</ h2 >

89 <f ieldset >1 < legend >Produto</ legend >

www.facebook.com/k19treinamentos 177

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 188/244

FILTROS 178

1112 <d iv c lass ="display -label" >13 @ Ht ml . D is pl ay Na me Fo r ( mo de l = > m od el . N om e )14 </ di v >15 <d iv c lass ="display -field" >

16 @ Ht ml . D is pl ay Fo r ( mo de l = > m od el . N om e )17 </ di v >1819 <d iv c lass ="display -label" >2 @ Ht ml . D is pl ay Na me Fo r ( mo de l = > m od el . P re co )21 </ di v >22 <d iv c lass ="display -field" >23 @ Ht ml . D is pl ay Fo r ( mo de l = > m od el . P re co )24 </ di v >25 < / f ieldset >26 <p >27 @ Ht ml . A ct io nL in k ( " B ac k t o L is t " , "Index" )28 < / p >

Código CSHTML 10.5: Visualizar.cshtml

Verique o funcionamento da ação Visualizar , acessando os seguintes endereços:

http://localhost:<PORTA_APP>/produto/visualizar?posicao=

http://localhost:<PORTA_APP>/produto/visualizar?posicao=1

http://localhost:<PORTA_APP>/produto/visualizar?posicao=-1

Ao acessarmos uma posição inválida, ocorrerá a seguinte exceção:

18 Adicione um ltro para tratar a exceção do tipo ArgumentOutOfRangeException .

1 [H an d leEr ro r (Ex cept io n Ty p e= typeof (ArgumentOutOfRangeException) ,2 View ="PosicaoInvalida" ) ]3 public ActionResult Visualizar ( in t posicao)4 {5 L is t < P ro du to > p r od u to s = d b . Pr o du t os . To Li s t () ;6 return View(produtos[posicao]) ;7 }

Código C# 10.29: ProdutoController.cs

178 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 189/244

179 FILTROS

19 Crie a página PosicaoInvalida na pasta Views/Shared .

1 @{2 Vie wB ag . Ti tl e = "Po s ição In v ál id a" ;3 }45 <h2 >Vo cê acesso u u ma p o s ição in v ál id a .< / h2 >

Código CSHTML 10.6: PosicaoInvalida.cshtml

20 Para o ltro HandlerErrorAttribute funcionar, habilite o elemento customErrors no arquivoWeb.config .

1 <sy s tem.w eb >2 < c us to mE rr or s m od e = "On"/ >3 ...4 < /sy stem.w eb >

Código XML 10.3: Web.cong

Acesse o seguinte endereço:

http://localhost:<PORTA_APP>/produto/visualizar?posicao=-1

O ltro deverá redirecioná-lo para a tela PosicaoInvalida .

www.facebook.com/k19treinamentos 179

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 190/244

FILTROS 180

180 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 191/244

TRATAMENTO DE ERROS

C A P

Í T U L O

11Inevitavelmente, as aplicações estão sujeitas a erros de várias naturezas. Por exemplo, erros po-

dem 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 ointuito de fazer o próprio usuário corrigir os valores preenchidos incorretamente. Veja o Capítulo 8.

Por outro lado, há erros que não são causados por falhas dos usuários. Por exemplo, um erro de

conexão com o banco de dados. Nesses casos, é improvável que os usuários possam fazer algo queresolva o problema. E mesmo que pudessem, provavelmente, não seria conveniente esperar que eleso zessem.

Quando um erro desse tipo ocorre, o ASP.NET MVC cria uma página web com informações so-bre o erro e a envia aos usuários. Para usuários locais, o ASP.NET MVC envia uma página web cominformações detalhadas do erro ocorrido. Para usuários remotos, a página web enviada não contéminformações detalhadas.

Em geral, não é conveniente que os usuários recebam detalhes técnicos sobre os erros geradospor falhas da aplicação. A primeira justicativa é que esses detalhes podem confundir os usuários.

Figura 11.1: Exemplo de uma página web com informações sobre um erro

www.facebook.com/k19treinamentos 181

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 192/244

TRATAMENTO DE ERROS 182

A segunda justicativa é que esses detalhes podem expor alguma falha de segurança da aplicação,deixando-a mais vulnerável a ataques.

Try-Catch

Os erros de aplicação podem ser identicados através do comando try-catch , que pode sercolocados nos métodos que denem as ações dos controladores. Ao identicar a ocorrência de umerro, os controladores podem devolver uma página web com alguma mensagem para o usuário.

1 ...2 [ H t tp P os t ]3 public A c t io n Resu l t Sa lva (Ed i to ra ed i to r a )4 {5 tr y6 {

7 db . Ed it or as . Add ( ed it or a) ;8 }9 catch

1 {11 return View( "Error" ) ;12 }1314 return RedirectToAction( "Index" ) ;15 }16 ...

Código C# 11.1: EditoraController.cs

Podemos criar umapágina Error.cshtml napasta Views\Shared. Dessaforma, todocontroladorpoderá devolver essa página.

1 @{2 Layout = null ;3 }45 <! D O CTY PE h tml>6 <html >7 <head >8 <title >Erro</ title >9 </ head >

1 < body >11 <h2 >12 S er vi do r c om p ro bl em as13 </ h2 >14 <p >15 H ou ve um p ro bl em a em n os so s er vi do r. < br />16 P or fa vo r t en te no va me nt e d en tr o d e a lg un s i ns ta nt es .17 </ p >18 < / body >19 < / html >

Código CSHTML 11.1: Error.cshtml

As páginas de erro que serão mostradas pelos controladores teriam uma mensagem simples in-formando que houve um erro na aplicação e que não é possível atender a requisição do usuárionaquele momento. Inclusive, seria conveniente padronizar a página de erro. Em outras palavras,todos os controladores teriam que mostrar a mesma página.

182 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 193/244

183 TRATAMENTO DE ERROS

Custom Errors

Utilizar o comando try-catch nos controladores para lidar com os erros de aplicação não é umaboa alternativa, pois o código do controlador ca mais complexo. Além disso, haveria replicação decó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, podemoscongurar o ASP.NET MVC para utilizar páginas de erro padrão. O primeiro passo é alterar o arquivode conguração Web.config , acrescentando a tag <customErrors> dentro da tag <system.web> .

1 ...2 <cu s tomEr ror s mo de= "On">34 < /cu s tomEr ror s>5 ...

Código XML 11.1: Web.Cong

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 os usuários locais e a padrão para osremotos.

Por convenção, o ASP.NET MVC mantémumapáginade erro padrãodentrodapasta Views\Sharedcomonome Error.cshtml . Vamos alterar este arquivo. O conteúdo da páginade erro é basicamenteHTML.

1 @{2 Layout = null ;3 }45 <! D O CTY PE h tml>6 <html >7 <head >8 <title >Erro</ title >9 </ head >

1 < body >11 <h2 >12 S er vi do r c om p ro bl em as13 </ h2 >14 <p >15 H ou ve um p ro bl em a no n os so s er vi do r. < br />16 P or fa vo r t en te no va me nt e d en tr o d e a lg un s i ns ta nt es .17 </ p >18 < / body >19 < / html >

Código CSHTML 11.2: Error.cshtml

Http Errors

www.facebook.com/k19treinamentos 183

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 194/244

TRATAMENTO DE ERROS 184

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 aotentarem 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-gurada no Web.config através da tag <customErrors> . Porém, esse erro não deve ser consideradoum erro de aplicação, pois ele pode ser gerado por falhas do usuário. Ele também não deve ser con-siderado um erro de usuário, pois ele pode ser gerado por falhas da aplicação. Consequentemente, écomum tratar o erro 404 de maneira particular, criando uma página de erro especíca para ele.

1 @{2 Layout = null ;3 }

45 <! D O CTY PE h tml>6 <html >7 <head >8 <title >A rq uiv o n ão en co nt r ad o !</ title >9 </ head >

1 < body >11 <h2 >12 E ss e a rq ui vo n ão f oi e n co nt ra do . Ver if iq ue s e a ur l es tá c o rr et a .13 </ h2 >14 < / body >15 < / html >

Código CSHTML 11.3: NotFound.cshtml

No arquivo de conguração, podemos especicar uma página web particular para o erro 404 oupara os outros erros do HTTP.

1 ...2 <cu s tomEr ror s mo de= "On">3 < e rr or s ta tu sC od e = "4 4" red irect= "~/ErrorPage/NotFound" />4 < /cu s tomEr ror s>5 ...

Código XML 11.2: Web.Cong

De acordo com o código anterior, devemos denir um controlador chamado ErrorPage comuma ação chamada NotFound. Essa ação será acionada toda vez que o erro 404 do HTTP ocorrer.

1 namespace K19.Contro l lers2 {3 p u b lic c las s Er ro rPag eCo n t ro lle r : Co n tro l ler4 {5 public ActionResult NotFound()6 {7 return View() ;8 }9 }

1 }

Código C# 11.2: ErroPageController.cs

184 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 195/244

185 TRATAMENTO DE ERROS

Exercícios de Fixação

1 Crie um projeto do tipo ASP.NET MVC 4 Web Application chamado TratamentoDeErros no Visual Studio 2012 Express for Web . Utilize o template Basic Project.

2 Crie um controlador Teste no projeto TratamentoDeErros , conforme o código abaixo.

1 namespace TratamentoDeErros .Contro l lers2 {3 p u b lic c las s Tes teCo n tro l le r : Co n tro l ler4 {5 public ActionResult TestaErro()6 {

7 string [ ] n om es = n ew s t r in g [] { " Jo n as H i r ata" , "Rafael Co sent in o " };8 str ing n o me = n o mes [2 ] ;9 return View() ;

1 }1112 }13 }

Código C# 11.3: TesteController.cs

Acesse o seguinte endereço http://localhost:<PORTA_APP>/Teste/TestaErro e verique atela de erro.

Observação: No Visual Web Developer, quando executamos a aplicação, ele a executa em mododebug . Dessa forma, toda vez que um erro for gerado no processamento de uma requisição, a exe-cução da aplicação é suspensa no ponto em que o erro ocorreu e detalhes sobre o problema sãoapresentados. Para continuar a execução da aplicação após a ocorrência de um erro, aperte a teclaF5.

3 Trate o erro do exercício anterior com o bloco try-catch e redirecione o usuário para uma telacom a seguinte mensagem “Sistema Temporariamente Indisponível”.

Altere a ação TestaErro do controlador Teste.

1 ...2 public ActionResult TestaErro()3 {4 tr y5 {6 string [ ] n o m es = n ew s t r in g [] { " Jo n as H i r ata" , "Rafae l Co sen t in o " };7 str ing n o me = n o mes [2 ] ;8 return View() ;9 }

1 catch11 {12 return View( "Error" ) ;13 }14 }15 ...

Código C# 11.4: TesteController.cs

www.facebook.com/k19treinamentos 185

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 196/244

TRATAMENTO DE ERROS 186

4 Altere o código do arquivo Error.cshtml da pasta Views\Shared conforme o código abaixo:

1 @{2 Layout = null ;3 }45 <! D O CTY PE h tml>6 <html >7 <head >8 <meta n ame="viewpor t" conten t ="width=device-width" />9 <title >Error</ title >

1 < / head >11 <body >12 <h2 >13 S is te ma Tem po ra ri am en te I nd is po ní ve l .. .14 </ h2 >15 < / body >16 < / html >

Código CSHTML 11.4: Error.cshtml

Acesse novamente o endereço http://localhost:<PORTA_APP>/Teste/TestaErro e veriquea nova página de erro.

5 Remova o bloco try-catch da ação TestaErro do controlador Teste que você adicionou noexercício anterior.

1 ...2 public ActionResult TestaErro()3 {4 string [ ] n o m es = n ew s t r in g [] { " Jo n as H i r ata" , "Rafael Co sent in o " };5 str ing n o me = n o mes [2 ] ;6 return View() ;7 }8 ...

Código C# 11.5: TesteController.cs

6 Altere o arquivo Web.config para congurar o ASP.NET MVC para utilizar páginas de erro pa-drão.

1 ...2 <sy s tem.w eb >3 < c us to mE rr or s m od e = "On">4 < /c us to mE rr or s >5 ...6 <sy s tem.w eb >7 ...

Código XML 11.3: Web.cong

Acesse o endereço http://localhost:<PORTA_APP>/Teste/TestaErro e verique a página deerro.

7 Vamos denir uma página para ser exibida quando o erro 404 ocorrer. Primeiramente, crie umcontrolador chamado ErrorPage com uma ação chamada NotFound.

1 namespace TratamentoDeErros .Contro l lers

186 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 197/244

187 TRATAMENTO DE ERROS

2 {3 p u b lic c lass Er ro rPag eCon t ro lle r : Co n t ro l ler4 {5 public ActionResult NotFound()6 {

7 return View() ;8 }9

1 }11 }

Código C# 11.6: ErroPageController.cs

8 Na pasta Views\ErrorPage do projeto Erros, adicione um arquivo chamado NotFound.cshtmlcom o seguinte conteúdo.

1 @{

2 Layout = null ;3 }45 <! D O CTY PE h tml>6 <html >7 <head >8 <title >A rq uiv o n ão en co nt r ad o !</ title >9 </ head >

1 < body >11 <h2 >12 E ss e a rq ui vo n ão f oi e n co nt ra do . Ver if iq ue s e a ur l es tá c o rr et a .13 </ h2 >14 < / body >15 < / html >

Código CSHTML 11.5: NotFound.cshtml

9 Altereo arquivoWeb.Config para denir que quando um erro 404 ocorrer, a página exibida deveser aquela que acabamos de criar.

1 ...2 <sy s tem.w eb >3 < c us to mE rr or s m od e = "On">4 < error s tatusCode = "4 4" red irect= "~/ErrorPage/NotFound" />5 </ customErrors >6 ...7 <sy s tem.w eb >8 ...

Código XML 11.4: Web.cong

Tente acessar páginas da aplicação que não existam. Acesse, por exemplo, o endereço http://localhost:<PORTA_APP>/PaginaInexistente .

www.facebook.com/k19treinamentos 187

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 198/244

TRATAMENTO DE ERROS 188

188 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 199/244

ASP.NET W EB API A P Ê

N D I C E

AParapermitir a implementação de webservices restful, o ASP.NET WebAPIfoi adicionado à quarta

versão do ASP.NET MVC. Webservices restful são baseados no estilo arquitetural REST. Discutiremos,a seguir, os principais conceitos desse estilo arquitetural.

REST

Resources

No estilo arquitetural REST, toda informação disponível é chamada de resource . Por exemplo,uma imagem é um resource. Uma lista de produtos é um resource. O cadastro de uma pessoa é umresource.

URIs

Todo resourcepossuium identicador únicoglobalmente. Os identicadoressão utililzadospara

acessar os respectivos resources. Particularmente, em umarede HTTP, os resources são identicadospor URIs(Uniform Resource Identier - http://tools.ietf.org/html/rfc3986 ). Por exemplo, aURI www.k19.com.br/cursos identica na internet a lista de cursos da K19.

Media Types

Um resource pode ser apresentado em diversos formatos. Na arquitetura REST, esses formatossão chamados de media type . Considere o cadastro de uma pessoa disponível em uma rede HTTP.Eventualmente, esse cadastro pode ser apresentado em html , xml ou json.

1 <html >2 <head >

3 <title >Rafae l Co sent in o </ title >4 <head >56 <body >7 <h1 >Rafae l Co sen t in o </ h1 >8 <p >Líd er d e t r e in amento s d a K 1 9 </ p >9 </ body >

1 < / html >

1 < p es s oa >2 < n om e > R af a el C o se n ti n o </ n o me >3 < d e sc r ic a o > Lí de r d e t r ei n am e nt o s d a K1 9 </ d e sc r ic a o >4 < p es s oa >

1 {"nome" : "Rafae l Co sen t in o " , "descr icao" : "L íder d e t r e inamen to s d a K 1 9 " }

www.facebook.com/k19treinamentos 189

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 200/244

ASP.NET W EB API 190

Operações

Em uma arquitetura REST, um conjunto pequeno e xo de operações deve ser denido previa-mente. As operações são utilizadas para manipular os recursos de alguma forma.

Por exemplo, em uma rede HTTP, os recursos são manipulados pelos métodos do protocoloHTTP. Podemos atribuir uma semântica diferente para cada um desses métodos.

Resource Método HTTP Semântica www.k19.com.br/cursos GET pega a lista de cursos www.k19.com.br/cursos POST adiciona um curso na lista

Resources

No ASP.NET Web API, os resources são denidos por controladores de uma aplicação ASP.NETMVC que derivam de System.Web.Http.ApiController .

1 p u b l ic c lass Cu r so sCo n tro l ler : A p iCon t ro lle r2 {3 ...4 }

Código C# A.1: CursosController.cs

URIs

As URIs dos resources são denidas através de rotas do ASP.NET Web API criadas no arquivoRouteConfig.cs . O Visual Web Developer adiciona a seguinte rota padrão do ASP.NET Web API nosprojetos ASP.NET MVC 4:

1 ro u tes .Map H t tp Ro u te (2 name : "DefaultApi" ,3 r ou te Te mp la te : "ap i/{contro l ler}/{id}" ,4 defaults : ne w { id = Ro u teParamete r.O p t io n a l }5 ) ;

Código C# A.2: RouteCong.cs

De acordo com a rota padrão do ASP.NET Web API, a URI do resource correspondente ao contro-lador Cursos é http://localhost:<PORTA_APP>/api/cursos .

Operações

Podemos associar as operações HTTP aos métodos da classe CursosController . Essas associa-ções são estabelecidas automaticamente através dos nomes dos métodos. Por exemplo, a operação

190 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 201/244

191 ASP.NET W EB API

GET do HTTP é associada automaticamente a um método cujo nome possui o prexo Get. Veja oexemplo abaixo.

1 p u b l ic c lass Cu r so sCo n tro l ler : A p iCon t ro lle r

2 {3 ...4 / / GET http : / / localhost :< PORTA_APP >/api/cursos5 public Curso[] GetCursos( )6 {7 ...8 }9 ...

1 }

Código C# A.3: CursosController.cs

Na rota padrão do ASP.NET Web API, um parâmetro opcional chamado id foi denido. Quandoesse parâmetro estiver presente em uma requisição do tipo GET, podemos recuperar o valor dele emum método cujo nome possua o prexo Get e tenha um argumento chamado id . Observe o códigoabaixo.

1 p u b l ic c lass Cu r so sCo n tro l ler : A p iCon t ro lle r2 {3 ...4 / / GET http : / / localhost :<PORTA_APP >/api/cursos/55 public Cu r so [ ] G e tCu r so ( in t id )6 {7 ...8 }9 ...

1 }

Código C# A.4: CursosController.cs

Também podemos recuperar parâmetros de URL. Para isso, basta denir argumentos com osmesmos nomes desses parâmetros nos métodos associados às operações do HTTP. Veja o exemploabaixo

1 p u b l ic c lass Cu r so sCo n tro l ler : A p iCon t ro lle r2 {3 ...4 / / GET http : / / localhost :<PORTA_APP >/api/cursos?sig la=K325 public Cu r so [ ] G e tCu r so ( string s ig la)6 {7 ...

8 }9 ...1 }

Código C# A.5: CursosController.cs

Considere o código a seguir.

1 p u b l ic c lass Cu r so sCo n tro l ler : A p iCon t ro lle r2 {3 ...4 / / POST http : / / localhost :< PORTA_APP >/api/cursos5 p u b lic v o id Po s tCu r so (Cu r so cu rso )6 {

7 ...8 }9 ...

www.facebook.com/k19treinamentos 191

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 202/244

ASP.NET W EB API 192

1 }

Código C# A.6: CursosController.cs

O método PostCurso() será associado a operação POST do HTTP. Os valores dos parâmetros en-viados dentro de uma requisição do tipo POST à url http://localhost:<PORTA_APP>/api/cursosserão armazenados automaticamente pelo ASP.NET Web API nas propriedades do argumento cursodo método PostCurso() de acordo com o nome dessas propriedades e dos nomes dos parâmetrosenviados. Por exemplo, o valor do parâmetro Nome será armazenado dentro da propriedade Nomecaso ambos existam.

Media Type

Por padrão, o ASP NET Web API utiliza os headers Content-type e Accept para denir o mediatype dos dados de entrada e saída. No exemploanterior, se uma requisição do tipo GETfor realizada àurl //POSThttp://localhost:<PORTA_APP>/api/cursos comheader Accept: application/json ,o resource correspondente será apresentado em formato JSON.

Exercícios de Fixação

1 Crie um projeto do tipo ASP.NET MVC 4 Web Application chamado WebApi no Visual Studio2012 Express for Web. Utilize o template Basic Project.

2 Vamos denir o nosso primeiro webservice utilizando web api. Para isso, adicione uma classepara modelar cursos na pasta Models.

1 namespace WebApi.Models2 {3 p u b lic c las s Curso4 {5 s ta tic in t contador ;67 public Curso()8 {9 Curso .contador ++;

1 this . I d = c o nt a do r ;11 }1213 p u b lic in t Id { ge t ; se t ; }14 public s tr ing S igla { ge t ; se t ; }15 public s tr ing N o me { ge t ; se t ; }16 }17 }

Código C# A.7: Curso.cs

3 Agora crie um controlador chamado Cursos para implementar as operações do webservice. Nacriação desse controlador, selecione o template Empty API Controller .

1 using System;

192 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 203/244

193 ASP.NET W EB API

2 using System.Collect ions .Gener ic;3 using System.Linq;4 using System.Net;5 using System.Net.Http ;6 using System.Web.Http ;

7 using Livrar iaVir tual .Models ;8 using System.Web.Mvc;9

1 namespace WebApi.Contro l lers11 {12 p u b lic c las s Cu r so sCo n tro l ler : A p iCon t ro lle r13 {14 pr ivate s tat ic L is t<Cu r so > cu r so s = ne w Lis t<Curso>15 {16 ne w Curso17 {18 Sigla = "K31",19 Nome = " C # e O r ie n ta ç ão a O b je t os "221 },22 ne w Curso23 {24 Sigla = "K32",25 Nome = "D esen v o lv imen to Web co m A SP .N ET MV C"2627 }28 };293 public L is t<Cu rso > G et ( )31 {32 return cursos;33 }3435 public Cu r so G e t ( string s ig la)36 {37 C ur so c ur so = c ur so s . Fi nd ( c = > c . Si gl a . Eq ua ls ( s ig la ) );38 return curso ;39 }441 public Cu r so G e t ( in t id )42 {43 Cur so c urso = c ur sos . Find (c = > c .Id == id );44 return curso ;45 }4647 p u b lic v o id Po s t (Cu rso cu r so )48 {49 cursos .Add (curso );5 }51 }52 }

Código C# A.8: CursosController.cs

4 Para testar o webservice que retorna a lista de cursos, basta acessar o seguinte endereço: http://localhost:<PORTA_APP>/api/cursos .

5 Teste o webservice que devolve o curso a partir de uma sigla. Basta acessar o seguinte endereço:http://localhost:<PORTA_APP>/api/cursos?sigla=K31 .

6 Teste o webservice que devolve um curso a partir de um id. Basta acessar o seguinte endereço:http://localhost:<PORTA_APP>/api/cursos/1 .

www.facebook.com/k19treinamentos 193

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 204/244

ASP.NET W EB API 194

7 Dena uma página com um formulário para testar o webservice que adiciona curso. Para isso,crie um controlador Curso conforme o código abaixo:

1 using System.Web.Mvc;

23 namespace WebApi.Contro l lers4 {5 p u b lic c las s Cu r so Co n tro l le r : Co n tro l ler6 {7 public ActionResult Cadastrar ( )8 {9 return View() ;

1 }1112 }13 }

Código C# A.9: CursoController.cs

8 Para testar o webservice que adiciona curso, devemos denir a página Cadastrar.cshtml .

1 @mo del Web Ap i .Mo d e ls .Cu r so23 @{4 ViewBag .Title = "Cadastrar" ;5 }67 <h2 >Cadastrar</ h2 >89 @u s in g ( H tml .Beg in Form(n u ll , n u ll , Fo rmMeth od .Po st , n ew { @ac tio n = " /ap i/cursos" }) )

1 {11 @ Ht ml . Val id at io nS um ma ry ( t ru e )1213 <f ieldset >14 <legend >Curso</ legend >1516 <d iv c las s ="editor- label" >17 @Html .LabelFor (model => model .Sigla )18 </ di v >19 <d iv c las s ="editor- f ie ld" >2 @Html .EditorFor (model => model .Sigla )21 @ Html . Val id at io nM es sa ge For ( mode l = > mode l. Si gla )22 </ di v >2324 <d iv c las s ="editor- label" >25 @Html .LabelFor (model => model .Nome )26 </ di v >27 <d iv c las s ="editor- f ie ld" >28 @Html .EditorFor (model => model .Nome )29 @ Html . Val id at io nM es sa ge For ( mode l = > mode l. Nome )3 </ di v >3132 <p >33 <in pu t ty pe ="submit" value ="Create" />34 </ p >35 </ f ieldset >36 }3738 <di v >39 @Htm l. Ac ti onL in k( " B a ck t o L is t " , "Index" )4 < / di v >41

42 @sect io n Scr ip t s {43 @S cri pt s. Re nde r( "~/bundles / jqueryval" )44 }

194 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 205/244

195 ASP.NET W EB API

Código CSHTML A.1: Cadastrar.cshtml

9 Testeo webservice que adiciona curso através do formulário criado no exercício anterior. Acesseo formulário através do seguinte endereço: http://localhost:<PORTA_APP>/Curso/Cadastrar .Para vericar se o curso foi adicionado, acesse http://localhost:<PORTA_APP>/api/cursos/ .

www.facebook.com/k19treinamentos 195

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 206/244

ASP.NET W EB API 196

196 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 207/244

PROJETO

A P Ê

N D I C E

BNos capítulos anteriores, vimos os recursos do ASP .NET MVC e do Entity Framework. Agora,

vamos solidicar os conhecimentos obtidos e, além disso, mostraremos alguns padrões e conceitosrelacionados ao desenvolvimento de aplicações web.

Como exemplo de aplicaçãodesenvolveremos umaaplicaçãode cadastro de jogadorese seleçõesde futebol.

ModeloPor onde começar o desenvolvimento de uma aplicação? Essa é uma questão recorrente. Um ótimoponto de partida é desenvolver as entidades principais da aplicação. No nosso caso, vamos nos res-tringir às entidades Selecao e Jogador . Devemos estabelecer um relacionamento entre essas entida-des já que um jogador atua em uma seleção.

Exercícios de Fixação

1 Crie um projeto do tipo ASP .NET MVC 4 Web Application chamado K19-CopaDoMundo se-guindo os passos vistos no exercício do capítulo 5.

2 Adicione na pasta Models as seguintes classes.

1 namespace K19CopaDoMundo.Models2 {3 p u b lic c las s Selecao4 {5 p u b lic in t Id { ge t ; se t ; }6 public s tr ing P a is { ge t ; se t ; }

7 public s tr ing Tecnico { ge t ; se t ; }8 }9 }

Código C# B.1: Selecao.cs

1 namespace K19CopaDoMundo.Models2 {3 p u b lic c las s Jogador4 {5 p u b lic in t Id { ge t ; se t ; }6 public s tr ing N o me { ge t ; se t ; }7 public s tr ing Po s icao { ge t ; se t ; }8 public D a teTime N ascimen to { ge t ; se t ; }

9 public double A l tur a { ge t ; se t ; }1 p u b lic in t Se lecao Id { ge t ; se t ; }11 public Se lecao Se lecao { ge t ; se t ; }

www.facebook.com/k19treinamentos 197

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 208/244

PROJETO 198

12 }13 }

Código C# B.2: Jogador.cs

Persistência - Mapeamento

Depois de denir algumas entidades podemos começar o processo de implementação da persis-tência da nossa aplicação. Vamos aplicar os recursos do Entity Framework - Code First que apren-demos nos primeiros capítulos. Inicialmente, vamos denir o mapeamento das nossas entidadesatravés de uma classe derivada de DbContext e acrescentar as propriedades referentes a chave pri-mária e chave estrangeira.

Exercícios de Fixação

3

Adicione as seguintes propriedades e anotações as classes Selecao e Jogador .

1 using System.ComponentModel .DataAnnotat ions .Schema;23 namespace K19CopaDoMundo.Models4 {

5 [ Table ( "Selecoes" ) ]6 p u b lic c las s Selecao7 {8 p u b lic in t Id { ge t ; se t ; }9 public s tr ing P a is { ge t ; se t ; }

1 public s tr ing Tecnico { ge t ; se t ; }11 p u b lic v i r tu a l Lis t<Jogador > Jogadores { ge t ; se t ; }12 }13 }

Código C# B.3: Selecao.cs

1 using System.ComponentModel .DataAnnotat ions .Schema;2

3 namespace K19CopaDoMundo.Models4 {5 [ Table ( "Jogadores" ) ]6 p u b lic c las s Jogador7 {8 p u b lic in t Id { ge t ; se t ; }9 public s tr ing N o me { ge t ; se t ; }

1 public s tr ing Po s icao { ge t ; se t ; }11 public D a teTime N ascimen to { ge t ; se t ; }12 public double A l tur a { ge t ; se t ; }13 p u b lic in t Se lecao Id { ge t ; se t ; }14 [ In ve rs eP ro per ty ( "Jogadores" ) ]15 public v ir tual Se lecao Se lecao { ge t ; se t ; }16 }17 }

Código C# B.4: Jogador.cs

198 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 209/244

199 B.3. PERSISTÊNCIA - M APE AMENTO

4 Adicione a classe K19CopaDoMundoContext a pasta Models.

1 using System.Data.Enti ty ;23 namespace K19CopaDoMundo.Models4 {5 p u b lic c las s K 1 9 Co p aD o Mu n d o Con tex t : D b Co ntex t6 {7 public DbSet<Selecao > Selecoes { ge t ; se t ; }8 public DbSet<Jogador > Jogadores { ge t ; se t ; }9 }

1 }

Código C# B.5: K19CopaDoMundoContext.cs

Persistência - Conguração

Precisamos denir a nossa string de conexão para que a nossa aplicação utilize a base de dadosk19copadomundo como padrão.

Exercícios de Fixação

5 Acrescente ao arquivo Web.cong , que ca na raiz do projeto, a string de conexão.

1 <co n n ect io n St r in g s>2 <add3 name ="K19CopaDoMundoContext" providerName= "System.Data.SqlClien t"4 connectionStr ing = "Server=. \SQLEXPRESS;Database=k19copadomundo;5 User Id=sa; Password=sa;Trusted_Connection= False;Mult ip leActiveResultSets= True" />6 < / co nn ec ti on St ri ng s >

Código XML B.1: Web.cong

Persistência - Repositórios Vamos deixar os repositórios para acessar as entidades da nossa aplicação preparados. Os repositó-rios precisam de DbContexts para realizar as operações de persistência. Então, cada repositório teráum construtor para receber um DbContext como parâmetro.

Exercícios de Fixação

6 Crie uma classe na pasta Models chamada SelecaoRepository .

1 using System;2 using System.Collect ions .Gener ic;34 namespace K19CopaDoMundo.Models5 {

6 p u b lic c las s Se lecao Repo s i tory : ID ispo sab le7 {8 p r iva te b o ol d i sp osed = false ;

www.facebook.com/k19treinamentos 199

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 210/244

PROJETO 200

91 pr ivate K19CopaDoMundoContext contex t;1112 public SelecaoRepository(K19CopaDoMundoContext contex t)13 {

14 this . co n tex t = co n tex t ;15 }1617 p u b lic v o id Adiciona(Selecao selecao)18 {19 c on te xt . Se le co es . Ad d( se le ca o) ;2 }2122 public Lis t<Selecao > Selecoes23 {24 ge t25 {26 return contex t .Selecoes .ToLis t( ) ;27 }28 }29 p u b lic v o id Salva()3 {31 c on te xt . Sa veC han ge s() ;32 }3334 p ro tec ted v i r tu a l v o id Dispose( bool d isposing)35 {36 if (! this .d isposed)37 {38 if (d isposing)39 {4 context . Dispose () ;41 }42 }43 this . d i sp osed = true ;44 }4546 p u b lic v o id Dispose()47 {48 Dispose ( true ) ;49 GC .SuppressFinalize ( this ) ;5 }51 }52 }

Código C# B.6: SelecaoRepository.cs

7 Analogamente crie um repositório de jogadores.

1 using System;2 using System.Collect ions .Gener ic;34 namespace K19CopaDoMundo.Models5 {6 p u b lic c las s Jo g ad o rRepo s i tory : ID ispo sab le7 {8 p r iva te b o ol d i sp osed = false ;9 pr ivate K19CopaDoMundoContext contex t;

111 public JogadorRepository(K19CopaDoMundoContext contex t)12 {13 this . co n tex t = co n tex t ;14 }15

16 p u b lic v o id Adiciona(Jogador jogador)17 {18 c on te xt . Jo ga do re s. Ad d( jo ga do r) ;

200 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 211/244

201 B.3. PERSISTÊNCIA - M APE AMENTO

19 }221 public Lis t<Jogador > Jogadores22 {23 ge t { return contex t . Jogadores .ToLis t ( ) ; }

24 }2526 p u b lic v o id Salva()27 {28 c on te xt . Sa veC han ge s() ;29 }331 p ro tec ted v i r tu a l v o id Dispose( bool d isposing)32 {33 if (! this .d isposed)34 {35 if (d isposing)36 {37 context . Dispose () ;38 }39 }4 this . d i sp osed = true ;41 }4243 p u b lic v o id Dispose()44 {45 Dispose ( true ) ;46 GC .SuppressFinalize ( this ) ;47 }48 }49 }

Código C# B.7: JogadorRepository.cs

Unit of Work O único propósito de criar uma classe UnitOfWork é ter certeza que quando temos múltiplos

repositórios eles compartilham o mesmo DbContext . Para isto, devemos apenas criar um métodoSalva e uma propriedade para cada repositório.

Exercícios de Fixação

8 Crie uma classe UnitOfWork na pasta Models.

1 using System;2 using System.Collect ions .Gener ic;34 namespace K19CopaDoMundo.Models5 {6 p u b lic c las s U n i tO fWo rk : ID ispo sab le7 {8 p r iva te b o ol d i sp osed = false ;9 pr ivate K 1 9 Co p aD o Mu n d o Co n tex t co n tex t = ne w K19CopaDoMundoContext( ) ;

1 pr ivate SelecaoRepository selecaoRepository ;11 pr ivate JogadorRepository jogadorRepository ;121314 public JogadorRepository JogadorRepository

15 {16 ge t17 {

www.facebook.com/k19treinamentos 201

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 212/244

PROJETO 202

18 if ( jo g ad o rRepo s i to ry == null )19 {2 jogadorRepository = ne w JogadorRepository(contex t) ;21 }22 return jogadorRepository ;

23 }24 }2526 public SelecaoRepository SelecaoRepository27 {28 ge t29 {3 if ( s e lecao Repo s i to ry == null )31 {32 selecaoRepository = ne w SelecaoRepository(contex t) ;33 }34 return selecaoRepository ;35 }36 }3738 p u b lic v o id Salva()39 {4 c on te xt . Sa veC han ge s() ;41 }4243 p ro tec ted v i r tu a l v o id Dispose( bool d isposing)44 {45 if (! this .d isposed)46 {47 if (d isposing)48 {49 context . Dispose () ;5 }51 }52 this . d i sp osed = true ;53 }5455 p u b lic v o id Dispose()56 {57 Dispose ( true ) ;58 GC .SuppressFinalize ( this ) ;59 }6 }61 }

Código C# B.8: UnitOfWork.cs

Apresentação - Template Vamos denir um template para as telas da nossa aplicação. Aplicaremos algumas regras CSS paramelhorar a parte visual das telas.

Exercícios de Fixação

9 Na pasta Content , altere o arquivo Site.css acrescentando algumas regras CSS.

1 . l og o2 {

3 v er ti ca l - a l ig n : mi d dl e ;4 }5

202 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 213/244

203 B.3. PERSISTÊNCIA - M APE AMENTO

6 . b ot a o7 {8 background - color : # 64 D 8 3 ;9 margin : 2 p x ;

1 color : white ;

11 t ex t - de co ra ti on : n on e ;12 font - size : 2 px ;13 l in e - he ig ht : 2 px ;14 padding : 5 p x ;15 v er ti ca l - a l ig n : m i dd l e ;16 }1718 . b o tao :h o v er19 {2 background - color : # cccccc ;21 color : # 6 6 66 6 6 ;22 }2324 . f o rmu la r io f ie ld se t25 {26 float : left ;27 margin : 2 p x ;28 border : 1 p x s ol i d # 3 33 3 33 ;29 }331 . f o rmu la r io f ie ld se t l eg en d32 {33 color : # 64 D 8 3 ;34 font - weight : b ol d ;35 }3637 . bo tao -formular io38 {39 background - color : # 64 D 8 3 ;4 color : # f f f f ff ;41 padding : 5 p x ;42 v er ti ca l - a l ig n : m i dd l e ;43 border : n on e ;44 }4546 . t i tu lo47 {48 color : # 64 D 8 3 ;49 c le ar : b ot h;5 }5152 . t ab e la53 {54 border : 1 p x s ol i d # 6 4 D 83 ;55 border - co l lapse : co l lap se ;56 }57

58 . t a be l a t r t h59 {6 background - color : # 64 D 8 3 ;61 color : # f f f f ff ;62 }6364 . t a be l a t r t h , . t a b el a t r t d65 {66 border : 1 p x s ol i d # 6 4 D 83 ;67 padding : 2 p x 5 p x ;68 }69771 /* S ty les f o r v a l id a t ion h e lpe r s72 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -* /73 . f ie ld-validat ion -er ror74 {75 color : # f f ;

www.facebook.com/k19treinamentos 203

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 214/244

PROJETO 204

76 }7778 . f ie ld-validat ion -val id79 {8 d isp lay : n on e ;

81 }8283 . input-validat ion -er ror84 {85 border : 1 p x s ol i d # f f ;86 background - color : # f f eeee ;87 }8889 .validation -summary -errors9 {91 font - weight : b ol d ;92 color : # f f ;93 }9495 .validation -summary -valid96 {97 d isp lay : n on e ;98 }

Código CSS B.1: Site.css

10 Copie o arquivo k19-logo.png da pasta K19-Arquivos da sua Área de Trabalho para a pastaImages .

11 Agora altere o arquivo _Layout.cshtml .

1 <! D O CTY PE h tml>2 <h tml lang ="en" >3 <head >4 <meta ch arse t ="utf -8" />5 <title >Co pa d o Mu nd o </title >6 <l ink h r ef ="~/__TemplateIcon . ico" re l ="sh o r tcu t i con " type ="image/x- icon" />7 <meta n ame="viewpor t" conten t ="width=device-width" />8 @ St yl es . R en de r ( "~/Content/ themes/base/css" , "~/Content/css" )9 @ Sc ri pt s . Re nd er ( "~/bundles /modern izr" )

1 < / head >11 <body >12 < hea der >13 <d iv c las s ="conten t -wrapper" >14 <d iv c lass ="f loat- lef t" >15 <p c la s s ="si te- t i t le" ><img c las s ="logo"16 sr c ="~/Images/k19- logo . jpg" al t ="K 1 9 Lo g o " /></ p > </ di v >17 <d iv c lass ="f loat- r igh t" >18 <nav >19 <u l i d ="menu" >2 < li >@Html.ActionLink( "Selecoes" , "Index" , "Selecao" ,null , ←

n ew { @ cl as s = "botao" })</ li >21 <li > @H tml .A c t io n Lin k ( "Jogadores" , "Index" , "Jogador" , n ul l , n e w { ←

@class= "botao" })</ li >22 </ ul >23 </ nav >24 </ di v >25 </ di v >26 </ header >27 <d iv i d ="body" >28 @ Re nde rS ect io n( "featured" , r eq ui r ed : f a l se )29 <section class ="conten t -wrapper main-conten t c lear - f ix" >

3 @RenderBody ()31 </ section >32 </ di v >

204 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 215/244

205 B.12. C ADASTRANDO E LISTANDO SELEÇÕES

33 < foo ter >34 <d iv c las s ="conten t -wrapper" >35 <d iv c lass ="f loat- lef t" >36 <p >&co py ; @D ateTime .N ow.Year - K 1 9 Co p a d o Mu n d o </p >37 </ di v >

38 <d iv c lass ="f loat- r igh t" >39 <u l i d ="social" >4 < li ><a h re f ="http : / / facebook.com/k19treinamentos" class =" ←

facebook" >Facebo o k - K 1 9 Tre inamen to s</ a ></ li >41 <li ><a h re f ="http : / / twit ter.com/k19treinamentos" class =" ←

twit ter" >Tw i tte r - K 1 9 Tre inamen to s</ a ></ li >42 </ ul >43 </ di v >44 </ di v >45 </ footer >46 @ Sc ri pt s . Re nd er ( "~/bundles / jquery" )47 @ Re nd er Se ct io n ( "scr ip ts" , r eq u ir ed : f a l se )48 < / body >49 < / html >

Código CSHTML B.1: _Layout.cshtml

Cadastrando e Listando Seleções

Na tela de seleções, vamos adicionar um formulário para cadastrar novas seleções e uma tabelapara apresentar as já cadastradas. Aplicaremos regras de validação especícas para garantir que ne-nhum dado incorreto seja armazenado no banco de dados.

Exercícios de Fixação

12 Para cadastrar a seleção, devemos denir o controlador.

1 using System;2 using System.Collect ions .Gener ic;3 using System.Data;4 using System.Data.Enti ty ;5 using System.Linq;6 using System.Web;7 using System.Web.Mvc;8 using K19CopaDoMundo.Models ;9

1 namespace K19CopaDoMundo.Contro l lers11 {12 p u b lic c las s Se lecao Co nt ro l le r : Co n t ro l ler13 {14 pr ivate U n i tO fWo rk u n i tOfWo rk = ne w UnitOfWork() ;1516 public ActionResult Create( )17 {18 return View() ;19 }221 p ro tec ted o v er rid e v o id Dispose( bool d isposing)22 {23 un itO fWo rk . Di sp os e() ;24 base .Dispose(d isposing) ;

25 }26 }27 }

www.facebook.com/k19treinamentos 205

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 216/244

PROJETO 206

Código C# B.9: SelecaoController.cs

13 Vamos criar uma tela Create.cshtml para cadastrar as seleções. Adicione o arquivo a pasta Views/Selecoes com o seguinte conteúdo.

1 @mo del K 1 9 Cop aD o Mu n d o .Mo d els .Se lecao23 @{4 ViewBag .Title = "Create" ;5 }67 <h2 >Create</ h2 >89 @u s in g (H tml .Beg in Fo rm( ) ) {

1 @ Ht ml . Val id at io nS um ma ry ( t ru e )1112 <f ieldset >13 <legend >Selecao</ legend >1415 <d iv c las s ="editor- label" >16 @Html .LabelFor (model => model .Pais )17 </ di v >18 <d iv c las s ="editor- f ie ld" >19 @Html .EditorFor (model => model .Pais )2 @ Html . Val id at io nM es sa ge For ( mode l = > mode l. Pais )21 </ di v >2223 <d iv c las s ="editor- label" >24 @Html .LabelFor (model => model .Tecnico )25 </ di v >26 <d iv c las s ="editor- f ie ld" >

27 @Html .EditorFor (model => model .Tecnico )28 @ Html . Val id at io nM es sa ge For ( mode l = > mode l. Tec ni co )29 </ di v >331 <p >32 <in pu t ty pe ="submit" value ="Create" />33 </ p >34 </ f ieldset >35 }3637 <di v >38 @Htm l. Ac ti onL in k( "L is tagem d e Se leçõ es" , "Index" )39 < / di v >441 @sect io n Scr ip t s {42 @S cri pt s. Re nde r( "~/bundles / jqueryval" )

43 }

Código CSHTML B.2: Create.cshtml

14 O próximo passo é denir a action que irá salvar a seleção no nosso banco de dados. Devemostambém acrescentar as validações a nossa entidade.

1 [ H t tp P os t ]2 public A c t ion Resul t Create (Se lecao se lecao )3 {4 if (ModelState . I sValid)5 {

6 u n it O fWo rk . S e l ec a oR e po s it o ry. A d ic i on a ( s el e ca o ) ;7 u ni tOf Wor k. Sa lva () ;8 return RedirectToAction( "Index" ) ;

206 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 217/244

207 B.12. C ADASTRANDO E LISTANDO SELEÇÕES

9 }1 return View(selecao) ;11 }

Código C# B.10: SelecaoController.cs

1 using System.ComponentModel .DataAnnotat ions .Schema;2 using System.ComponentModel .DataAnnotat ions;34 namespace K19CopaDoMundo.Models5 {6 [ Table ( "Selecoes" ) ]7 p u b lic c las s Selecao8 {9 p u b lic in t Id { ge t ; se t ; }

1 [ Re qu ir ed ( Er ro rM es sa ge = " O c am p o P ai s é o b ri g at ó ri o . " ) ]11 public s tr ing P a is { ge t ; se t ; }12 [ Re qu ir ed ( Er ro rM es sa ge = " O c am p o Te cn i co é13 obr igatór io ." ) ] p u b l ic s t r in g Tecn ico { ge t ; se t ; }14 public v ir tual Lis t<Jogador > Jogadores { ge t ; se t ; }15 }16 }

Código C# B.11: Selecao.cs

15 Dena a action e a página para listar todas as entidades de seleção.

1 public ActionResult Index()2 {3 return View(unitOfWork .SelecaoRepository.Selecoes) ;4 }

Código C# B.12: SelecaoController.cs

1 @mo del IEn u merab le<K 1 9 Co p aDo Mu n do .Mo d e ls .Se lecao >23 @{4 ViewBag .Title = "Index" ;5 }67 <h2 >Index</ h2 >89 <p >

1 @Htm l. Ac ti onL in k( "Crea te N ew " , "Create" )11 < / p >12 <table >13 <tr >14 <th >15 @Html .Disp layNameFor (model => model .Pais )16 </ th >17 <th >18 @Html .Disp layNameFor (model => model .Tecnico )19 </ th >2 < th ></ th >21 </ tr >2223 @ f or e ac h ( v ar i te m i n M od e l ) {24 <tr >25 <td >26 @Html .Disp layFor (modelI tem => item .Pais )27 </ td >28 <td >

29 @Html .Disp layFor (modelI tem => item .Tecnico )3 </ td >31 </ tr >

www.facebook.com/k19treinamentos 207

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 218/244

PROJETO 208

32 }3334 < / table >

Código CSHTML B.3: Index.cshtml

16 Vamos denir a tela de listagem de Seleções como a página principal do nosso site. Altere a rotapadrão no arquivo RouteCong.cs.

1 ro u tes .Map Rou te (2 name : "Default" ,3 url : "{contro l ler}/{action}/{id}" ,4 defau lts : ne w { c o nt r ol l er = "Selecao" , a ct io n = "Index" ,5 i d = U rl Pa ra me te r . Op ti on al } );

Código C# B.13: RouteCong.cs

Removendo Seleções Vamos acrescentar a funcionalidade de remover seleções.

Exercícios de Fixação

17

Acrescente uma coluna na tabela de listagem de seleções.

1 @mo del IEn u merab le<K 1 9 Co p aDo Mu n do .Mo d e ls .Se lecao >23 @{4 ViewBag .Title = "Index" ;5 }67 <h2 >Index</ h2 >89 <p >

1 @Htm l. Ac ti onL in k( "Crea te N ew " , "Create" )11 < / p >12 <table >13 <tr >14 <th >15 @Html .Disp layNameFor (model => model .Pais )16 </ th >17 <th >18 @Html .Disp layNameFor (model => model .Tecnico )19 </ th >2 < th ></ th >21 </ tr >2223 @ f or e ac h ( v ar i te m i n M od e l ) {24 <tr >25 <td >26 @Html .Disp layFor (modelI tem => item .Pais )27 </ td >

28 <td >29 @Html .Disp layFor (modelI tem => item .Tecnico )3 </ td >

208 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 219/244

209 B.12. C ADASTRANDO E LISTANDO SELEÇÕES

31 <td >32 @ Html . Ac ti onL ink ( "Remover" , "Delete" , n e w { i d = i t e m . I d } )33 </ td >34 </ tr >35 }

3637 < / table >

Código CSHTML B.4: Index.cshtml

18 Dena um método Busca na classeSelecaoRepository queretornaumaentidadeseleçãoapartirde um parâmetro id.

1 public Se lecao Bu sca( in t id )2 {3 return contex t .Selecoes .Find( id) ;4 }

Código C# B.14: SelecaoRepository.cs

19 Dena uma action Delete que irá mostrar a tela de conrmação de remoção da entidade.

1 public A c t io n Resu l t D e lete ( in t id )2 {3 S e le c ao s e le c ao = u n it O fWo rk . S e l ec a oR e po s it o ry. B u sc a ( id ) ;4 return View(selecao) ;5 }

Código C# B.15: SelecaoController.cs

20 Dena a tela de conrmação de remoção da seleção.

1 @mo del K 1 9 Cop aD o Mu n d o .Mo d els .Se lecao23 @{4 ViewBag .Title = "Delete" ;5 }67 <h2 >Remo ção d e Se leção </ h2 >89 <h3 >Vo cê tem ce r teza q u e d eseja r emov er es ta se leção ?</ h3 >

1 < f ieldset >11 <legend >Selecao</ legend >1213 <d iv c las s ="display -label" >14 @Htm l. Dis pl ay Na me Fo r( model = > mode l. Pais )15 </ di v >16 <d iv c las s ="display -field" >17 @ Html . Di sp lay For ( model = > model . Pais )18 </ di v >192 < d iv c las s ="display -label" >21 @Htm l. Dis pl ay Na me Fo r( model = > mode l. Tec ni co )22 </ di v >23 <d iv c las s ="display -field" >24 @ Html . Di sp lay For ( model = > model . Tec ni co )25 </ di v >26 < / f ieldset >

27 @u s in g (H tml .Begin Form( ) ) {28 <p >29 <in pu t ty pe ="submit" value ="Delete" /> |

www.facebook.com/k19treinamentos 209

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 220/244

PROJETO 210

3 @Html . ActionLink ( "Lis tagem D e Se leçõ es" , "Index" )31 </ p >32 }

Código CSHTML B.5: Delete.cshtml

21 Dena um método na classe SelecaoRepository que remove uma entidade seleção a partir deum parâmetro id .

1 p u b l ic v o id Remove(in t id )2 {3 S el ec ao s el ec ao = B us ca ( id );4 c on te xt . S el ec oe s . Re mo ve ( s el ec ao ) ;5 }

Código C# B.16: SelecaoRepository.cs

22 Dena a action que remove a seleção do banco de dados.

1 [ H t tp P os t ]2 [A c t io nN ame( "Delete" ) ]3 public ActionResult DeleteConf irmed ( in t id )4 {5 u n it O fWo rk . S e l ec a oR e po s it o ry. R e mo ve ( i d );6 u ni tOf Wor k. Sa lva () ;7 return RedirectToAction( "Index" ) ;8 }

Código C# B.17: SelecoesController.cs

Cadastrando, Listando e Removendo JogadoresNa tela de jogadores, vamos adicionar um formulário para cadastrar novos jogadores e uma tabelapara apresentar os já cadastrados. Aplicaremos regras de validação especícas para garantir que ne-nhum dado incorreto seja armazenado no banco de dados.

Exercícios de Fixação

23 Para cadastrar o jogador, devemos denir o controlador.

1 using System;2 using System.Collect ions .Gener ic;3 using System.Data;4 using System.Data.Enti ty ;5 using System.Linq;6 using System.Web;7 using System.Web.Mvc;8 using K19CopaDoMundo.Models ;9

1 namespace K19CopaDoMundo.Contro l lers11 {

12 p u b lic c las s Jo g ad o rCo nt ro l le r : Co n t ro l ler13 {14 pr ivate U n i tO fWo rk u n i tOfWo rk = ne w UnitOfWork() ;

210 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 221/244

211 B.12. C ADASTRANDO E LISTANDO SELEÇÕES

1516 public ActionResult Create( )17 {18 ViewBag .SelecaoId = ne w SelectLis t(unitOfWork .SelecaoRepository .Selecoes , "Id" , ←

"Pais" ) ;

19 return View() ;2 }2122 p ro tec ted o v er rid e v o id Dispose( bool d isposing)23 {24 un itO fWo rk . Di sp os e() ;25 base .Dispose(d isposing) ;26 }27 }28 }

Código C# B.18: JogadorController.cs

24 Vamos criar uma tela Create.cshtml para cadastrar os jogadores. Adicione o arquivo a pasta Views/Jogador com o seguinte conteúdo.

1 @mo del K 1 9 Cop aD o Mu n d o .Mo d els . Jo g ado r23 @{4 ViewBag .Title = "Create" ;5 }67 <h2 >Create</ h2 >89 @u s in g (H tml .Beg in Fo rm( ) ) {

1 @ Ht ml . Val id at io nS um ma ry ( t ru e )1112 <f ieldset >13 <legend >Jogador</ legend >1415 <d iv c las s ="editor- label" >16 @Html .LabelFor (model => model .Nome )17 </ di v >18 <d iv c las s ="editor- f ie ld" >19 @Html .EditorFor (model => model .Nome )2 @ Html . Val id at io nM es sa ge For ( mode l = > mode l. Nome )21 </ di v >2223 <d iv c las s ="editor- label" >24 @Html .LabelFor (model => model .Posicao )25 </ di v >26 <d iv c las s ="editor- f ie ld" >27 @Html .EditorFor (model => model .Posicao )28 @ Html . Val id at io nM es sa ge For ( mode l = > mode l. Pos ic ao )29 </ di v >331 <d iv c las s ="editor- label" >32 @Html .LabelFor (model => model .Nascimento )33 </ di v >34 <d iv c las s ="editor- f ie ld" >35 @Html .EditorFor (model = > model .Nascimento )36 @ Html . Val id at io nM es sa ge For ( mode l = > mode l. Na sci men to )37 </ di v >3839 <d iv c las s ="editor- label" >4 @Html .LabelFor (model => model .Altura )41 </ di v >42 <d iv c las s ="editor- f ie ld" >43 @Html .EditorFor (model => model .Altura )

44 @ Html . Val id at io nM es sa ge For ( mode l = > mode l. Altu ra )45 </ di v >46

www.facebook.com/k19treinamentos 211

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 222/244

PROJETO 212

47 <d iv c las s ="editor- label" >48 @Html .LabelFor (model => model .SelecaoId )49 </ di v >5 < d iv c las s ="editor- f ie ld" >51 @Html . DropDownList ("SelecaoId" , S t r in g .Emp ty )

52 @ Html . Val id at io nM es sa ge For ( mode l = > mode l. Se le cao Id )53 </ di v >5455 <p >56 <in pu t ty pe ="submit" value ="Create" />57 </ p >58 </ f ieldset >59 }661 <di v >62 @Htm l. Ac ti onL in k( "L is tagem d e Jo g ad o res" , "Index" )63 < / di v >6465 @sect io n Scr ip t s {66 @S cri pt s. Re nde r( "~/bundles / jqueryval" )67 }

Código CSHTML B.6: Create.cshtml

25 O próximo passo é denir a action que irá salvar o jogador no nosso banco de dados. Devemostambém acrescentar as validações a nossa entidade.

1 [ HttpPost ]2 public A c t ion Resul t Create ( Jo g ado r jo g ad o r )3 {4 if (ModelState . I sValid)5 {6 unitOfWork .JogadorRepository .Adiciona (jogador );

7 unitOfWork . Salva () ;8 return RedirectToAction( "Index" ) ;9 }

1 ViewBag . SelecaoId = ne w SelectLis t(unitOfWork . SelecaoRepository.Selecoes , ←

"Id" , "Pais" ) ;11 return View() ;12 }

Código C# B.19: JogadorController.cs

1 using System.ComponentModel .DataAnnotat ions .Schema;2 using System.ComponentModel .DataAnnotat ions;34 namespace K19CopaDoMundo.Models5 {6 [ Table ( "Jogadores" ) ]7 p u b lic c las s Jogador8 {9 p u b lic in t Id { ge t ; se t ; }

1 [ Re qu ir ed ( Er ro rM es sa ge = " O c am p o N om e é o b ri g at ó ri o . " ) ]11 public s tr ing N o me { ge t ; se t ; }12 [ Re qu ir ed ( Er ro rM es sa ge = " O c am p o P o si c ao é13 obr igatór io ." ) ] p u b l ic s t r in g Po s icao { ge t ; se t ; }14 [ Re qu ir ed ( Er ro rM es sa ge = " O c am p o N a sc i me n to é15 obr igatór io ." ) ]16 [ D at aTyp e ( Da ta Ty pe . D at e )]17 public D a teTime N asc imen to { ge t ; se t ; }18 [ Re qu ir ed ( Er ro rM es sa ge = " O c am p o A l t u ra é19 obr igatór io ." ) ]2 public double A l tur a { ge t ; se t ; }

21 p u b lic in t Se lecao Id { ge t ; se t ; }22 [ In ve rs eP ro per ty ( "Jogadores" ) ]23 public v ir tual Se lecao Se lecao { ge t ; se t ; }

212 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 223/244

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 224/244

PROJETO 214

Código CSHTML B.7: Index.cshtml

Removendo Jogadores Vamos acrescentar a funcionalidade de remover jogadores.

Exercícios de Fixação

27 Acrescente uma coluna na tabela de listagem de jogadores.

1 @mo del IEn u merab le<K 1 9 Co p aDo Mu n do .Mo d e ls . Jo gad o r>23 @{4 ViewBag .Title = "L is tag em d e Jo g ad o res" ;5 }67 <h2 >Lis tag em d e Jo g ad o res</ h2 >89 <p >

1 @Htm l. Ac ti onL in k( "Cad as tr a r Jo g ad o r " , "Create" )11 < / p >12 <table >13 <tr >14 <th >15 @Html .Disp layNameFor (model => model .Nome )16 </ th >17 <th >18 @Html .Disp layNameFor (model => model .Posicao )19 </ th >2 < th >21 @ Html . Di sp lay Na me Fo r( model = > m odel . Na sc ime nto )22 </ th >23 <th >24 @Html .Disp layNameFor (model => model .Altura )25 </ th >26 <th >27 @Html .Disp layNameFor (model => model .SelecaoId )28 </ th >29 <th ></ th >3 </ tr >3132 @ f or e ac h ( v ar i te m i n M od e l ) {33 <tr >34 <td >35 @Html .Disp layFor (modelI tem => item .Nome )36 </ td >37 <td >38 @Html .Disp layFor (modelI tem => item .Posicao )39 </ td >4 < td >41 @Html .Disp layFor (modelI tem => item .Nascimento )42 </ td >43 <td >44 @Html .Disp layFor (modelI tem => item .Altura )45 </ td >46 <td >47 @Html .Disp layFor (modelI tem => item .SelecaoId )

48 </ td >49 <td >@Html.ActionLink( "Remover" , "Delete" ,5 n ew { id = it em . Id }) </ td > </ tr >

214 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 225/244

215 B.12. C ADASTRANDO E LISTANDO SELEÇÕES

51 }52 < / table >

Código CSHTML B.8: Index.cshtml

28 Dena um método Busca na classe JogadorRepository que retorna uma entidade jogador apartir de um parâmetro id.

1 public Jo g ad or Bu sca( in t id )2 {3 return contex t . Jogadores .Find( id) ;4 }

Código C# B.22: JogadorRepository.cs

29 Dena uma action Delete que irá mostrar a tela de conrmação de remoção da entidade.

1 public A c t io n Resu l t D e lete ( in t id )2 {3 J o ga d or j o ga d or = u n it O fWo rk . J o g ad o rR e po s it o ry. B u sc a ( id ) ;4 return View(jogador) ;5 }

Código C# B.23: JogadorController.cs

30 Dena a tela de conrmação de remoção do jogador.

1 @mo del K 1 9 Cop aD o Mu n d o .Mo d els . Jo g ado r23 @{4 ViewBag .Title = "Remoção d o Jo g ad o r " ;5 }67 <h2 >Remo ção d o Jo g ad o r</ h2 >89 <h3 >Vo cê tem ce r teza q u e d eseja r emov er es te jo g ad o r?</ h3 >

1 < f ieldset >11 <legend >Jogador</ legend >1213 <d iv c las s ="display -label" >14 @Htm l. Dis pl ay Na me Fo r( model = > mode l. Nome )15 </ di v >16 <d iv c las s ="display -field" >17 @ Html . Di sp lay For ( model = > model . Nome )18 </ di v >192 < d iv c las s ="display -label" >21 @Htm l. Dis pl ay Na me Fo r( model = > mode l. Pos ic ao )22 </ di v >23 <d iv c las s ="display -field" >24 @ Html . Di sp lay For ( model = > model . Pos ic ao )25 </ di v >2627 <d iv c las s ="display -label" >28 @ Ht ml . Di sp la yN am eF or ( mo de l = > m od el . Na sc im en to )29 </ di v >3 < d iv c las s ="display -field" >31 @ Ht ml . Di sp la yF or ( mo de l = > m od el . Na sc im en to )

32 </ di v >3334 <d iv c las s ="display -label" >

www.facebook.com/k19treinamentos 215

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 226/244

PROJETO 216

35 @Htm l. Dis pl ay Na me Fo r( model = > mode l. Altu ra )36 </ di v >37 <d iv c las s ="display -field" >38 @ Html . Di sp lay For ( model = > model . Al tu ra )39 </ di v >

441 <d iv c las s ="display -label" >42 @ Ht ml . Di sp la yN am eF or ( mo de l = > m od el . Se le ca oI d)43 </ di v >44 <d iv c las s ="display -field" >45 @ Ht ml . Di sp la yF or ( mo de l = > m od el . Se le ca oI d)46 </ di v >47 < / f ieldset >48 @u s in g (H tml .Begin Form( ) ) {49 <p >5 < in pu t ty pe ="submit" value ="Delete" /> |51 @Html . ActionLink ( "Lis tagem d e Jo g ad o res" , "Index" )52 </ p >53 }

Código CSHTML B.9: Delete.cshtml

31 Dena um método na classe JogadorRepository que remove uma entidade jogador a partir deum parâmetro id .

1 p u b l ic v o id Remove(in t id )2 {3 J og ad or j og ad or = c on te xt . J og ad or es . F in d (i d) ;4 c on te xt . J og ad or es . R em ov e ( jo ga do r );5 }

Código C# B.24: JogadorRepository.cs

32 Dena a action que remove o jogador do banco de dados.

1 [ H t tp P os t ]2 [A c t io nN ame( "Delete" ) ]3 public ActionResult DeleteConf irmed ( in t id )4 {5 u n it O fWo rk . J o g ad o rR e po s it o ry. R e mo ve ( i d );6 u ni tOf Wor k. Sa lva () ;7 return RedirectToAction( "Index" ) ;8 }

Código C# B.25: JogadoresController.cs

Membership e AutorizaçãoNa maioria dos casos, as aplicações devem controlar o acesso dos usuários. Vamos implementar ummecanismo de autenticação na nossa aplicação utilizando ltro e Membership. As requisições feitaspelos usuários passarão pelo ltro. A função do ltro é vericar se o usuário está logado ou não. Seestiver logado o ltro autoriza o acesso. Caso contrário, o ltro redirecionará o usuário para a tela delogin.

Exercícios de Fixação

216 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 227/244

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 228/244

PROJETO 218

6667 }

Código C# B.26: Usuario.cs

34 Acrescente a seguinte classe a pasta Controllers .

1 using System;2 using System.Collect ions .Gener ic;3 using System.Linq;4 using System.Web;5 using System.Web.Mvc;6 using System.Web.Secur i ty ;7 using K19CopaDoMundo.Models ;89 namespace K19CopaDoMundo.Contro l lers

1 {

11 p u b lic c las s U su ar io Co nt ro l le r : Co n t ro l ler12 {13 //14 / / G ET: /U su ario /Lo g in1516 public ActionResult Login()17 {18 return View() ;19 }221 //22 / / PO ST: /U su ario /Lo g in2324 [ HttpPost ]25 public A c t ion Resul t Lo g in (Lo g in Mod el mo de l , str ing returnUrl)26 {27 if (ModelState . I sValid)28 {29 if (Membersh ip . ValidateUser(model .UserName , model .Password))3 {31 F or ms Au th en ti ca ti on . S et Au th Co ok ie ( m od el . Us er Na me , m od el . R em em be rM e );32 if (U r l . I sLo ca lUr l ( r e tu rnU r l ) && re turn U r l .Leng th > 1 && re turn U r l . ←

Star tsWith( " /" )33 && ! returnUrl . Star tsWith ( "/ /" ) && ! r e tu rnU r l .S ta r tsWi th ( "/ \ \" ) )34 {35 return Redirect( returnUrl) ;36 }37 else38 {39 return RedirectToAction( "Index" , "Selecao" ) ;4 }41 }42 else43 {44 ModelState .AddModelError ( "" , " O u s uá r io e / ou a s en h a e st á i n co r re t o . " ) ;45 }46 }474849 return View(model) ;5 }5152 //53 / / G ET: /U su ario /Lo g O ff5455 public ActionResult LogOff( )56 {

57 F or ms Au th en ti ca ti on . Si gn Ou t () ;5859 return Redirect( " /" ) ;

218 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 229/244

219 B.12. C ADASTRANDO E LISTANDO SELEÇÕES

6 }6162 //63 / / G ET: /U su ario /Reg is te r64

65 public ActionResult Regis ter ( )66 {67 return View() ;68 }697 //71 / / PO ST: /U su ario /Reg iste r7273 [ HttpPost ]74 public ActionResult Regis ter (Regis terModel model)75 {76 if (ModelState . I sValid)77 {78 / / A t te m pt t o r e gi s te r t he u se r79 M em be rs hi pC re at eS ta tu s c re at eS ta tu s;8 M e mb e rs h ip . C r e at e Us e r ( mo de l . U se rN am e , m o de l . Pa s sw or d , m od e l . Em ai l , null , null ←

, true , null , ou t createStatus) ;8182 if ( c r ea teSta tu s == Memb ersh ip Crea teSta tu s .Su ccess )83 {84 F or ms Au th en ti ca ti on . Se tA ut hC oo ki e (m od el . Us er Na me , false /* ←

createPers is ten tCookie * / ) ;85 return Redirect( " /" ) ;86 }87 else88 {89 ModelState .AddModelError ( "" , ErrorCodeToStr ing(createStatus ) ) ;9 }91 }929394 return View(model) ;95 }9697 //98 / / G ET: /U su ario /Ch an g ePassw ord99

1 [ Author ize ]1 1 public ActionResult ChangePassword()1 2 {1 3 return View() ;1 4 }1 51 6 //1 7 / / PO ST: /U su ario /Ch an g ePasswo rd1 81 9 [ Author ize ]

11 [ HttpPost ]111 public ActionResult ChangePassword(ChangePasswordModel model)112 {113 if (ModelState . I sValid)114 {115116117 bool changePasswordSucceeded;118 tr y119 {12 M em be rs hi pU se r c ur re nt Us er = M em be rs hi p . Ge tU se r ( Us er . I de nt it y.N am e , true /* ←

userIsOnline * / ) ;121 c ha ng eP as sw or dS uc ce ed ed = c ur re nt Us er . C ha ng eP as sw or d ( mo de l . Ol dP as sw or d , ←

model.NewPassword) ;122 }123 catch (Exception)124 {125 changePasswordSucceeded = false ;

www.facebook.com/k19treinamentos 219

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 230/244

PROJETO 220

126 }127128 if (changePasswordSucceeded)129 {13 return RedirectToAction( "ChangePasswordSuccess" ) ;

131 }132 else133 {134 ModelState .AddModelError ( "" , " A s e nh a a tu a l o u a c o nf i rm a çã o e st á i n co r re t a ←

. " ) ;135 }136 }137138139 return View(model) ;14 }141142 //143 / / G ET: /U su ario /Ch an g ePassw o rdSu ccess144145 public ActionResult ChangePasswordSuccess ( )146 {147 return View() ;148 }14915 pr ivate IEnumerable < string > GetErrorsFromModelState( )151 {152 return Mo d e lS tate .Se lec tMan y (x => x .Va lue .Er ro r s .Selec t ( e rro r => e r ror. ←

ErrorMessage)) ;153 }154155 # re gi on S ta tu s C od es156 p r iva te s ta tic s t r in g ErrorCodeToStr ing(Membersh ipCreateStatus createStatus)157 {158 / / See h t tp : //g o .mic roso f t . com/fw l ink /?Lin k ID =1 7 7 5 5 fo r159 / / a f ul l l is t o f s t at u s c od e s .16 switch (createStatus)161 {162 case Membersh ipCreateStatus .DuplicateUserName:163 return " E s te n om e d e u s uá r io j á e xi s te . D e fi n a o ut r o u s uá r io . " ;164165 case Membersh ipCreateStatus .DuplicateEmail :166 return "Es te email j á f o i cad ast r ad o . D ef in a o u t ro emai l . " ;167168 case Membersh ipCreateStatus . InvalidPassword:169 return "Sen h a in cor r e ta . " ;17171 case Membersh ipCreateStatus . InvalidEmail :172 return "Emai l in v ál id o . " ;173174 case Membersh ipCreateStatus . InvalidAnswer :175 return "Respo s ta in v ál id a p a ra r ecup era r a sen ha . " ;

176177 case Membersh ipCreateStatus . InvalidQuestion :178 return "Q u estão in v ál id a p a ra r ecu pera r a senh a . " ;17918 case Membersh ipCreateStatus . InvalidUserName:181 return "U su ár io in v ál id o . " ;182183 case Membersh ipCreateStatus .ProviderError :184 return "O co r reu u m e r ro d u ran te a au tent icação . Se o p ro blema p er si s ti r , ←

co n ta te o ad minis t r ad o r. " ;185186 case Membersh ipCreateStatus .UserRejected :187 return "O cad as t ro d o u su ár io fo i can celad o . Se o p ro blema p er si s ti r , ←

co n ta te o ad minis t r ad o r. " ;188189 default :19 return "U m er ro in esperado o co rr eu . Se o p ro blema p er si s ti r , co n ta te o ←

adminis trador." ;

220 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 231/244

221 B.12. C ADASTRANDO E LISTANDO SELEÇÕES

191 }192 }193 # endregion194 }195

196 }

Código C# B.27: UsuarioController.cs

35 Crie uma pasta Usuario na pasta Views e acrescente os quatro arquivos abaixo.

1 @mo del K 1 9 Cop aD o Mu n d o .Mo d els .Ch an g ePassw o rdMo d el23 @{4 ViewBag .Title = "A l ter ação d e senh a" ;5 }67 < h gr o up class ="ti t le" >8 <h1 >@ViewBag.Tit le .</ h1 >9 <h2 >U t i l ize es te f o rmulá r io p a r a a l ter a r a su a sen h a .< / h2 >

1 < /h g ro u p >1112 <p c lass ="message -info" >13 S en h as d ev em t er no m ín i mo @ M em b er s hi p . M i nR e qu i re d Pa s sw o rd L en g th c a ra c te r es .14 < / p >1516 @u s in g (H tml .Begin Form( ) ) {17 @ Ht ml . Val id at io nS um ma ry ( )1819 <f ieldset >2 < legend >A l te ração d e Sen ha</ legend >21 <ol >22 <li >

23 @Html . LabelFor (m => m. OldPassword )24 @Html . PasswordFor (m => m. OldPassword )25 </ li >26 <li >27 @Html . LabelFor (m => m. NewPassword )28 @Html . PasswordFor (m => m. NewPassword )29 </ li >3 < li >31 @Html . LabelFor (m => m. ConfirmPassword )32 @Html . PasswordFor (m => m. Conf irmPassword )33 </ li >34 </ ol >35 <in pu t ty pe ="submit" value ="A l te ra r Sen ha" / >36 </ f ieldset >37 }38

39 @sect io n Scr ip t s {4 @S cri pt s. Re nde r( "~/bundles / jqueryval" )41 }

Código CSHTML B.10: ChangePassword.cshtml

1 @{2 ViewBag .Title = "Sen h a a l ter ad a" ;3 }45 < h gr o up class ="ti t le" >6 <h1 >@ViewBag.Tit le .</ h1 >7 <h2 >Su a sen h a fo i a l t er ad a co m su cesso .< / h2 >8 < / h gr o up >

Código CSHTML B.11: ChangePasswordSuccess.cshtml

www.facebook.com/k19treinamentos 221

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 232/244

PROJETO 222

1 @mo del K 1 9 Cop aD o Mu n d o .Mo d els .Lo g in Mo d el23 @{4 ViewBag .Title = " L og i n " ;

5 }67 < h gr o up class ="ti t le" >8 <h1 >@ViewBag.Tit le .</ h1 >9 <h2 >Fo rmulá r io d e Lo gin </ h2 >

1 < /h g ro u p >1112 @u s in g (H tml .Begin Form(n ew { Re turn U r l = ViewBag .Re tu rn U r l } ) ) {13 @ Ht ml . Val id at io nS um ma ry ( tr ue , "Log in n ão fo i e f e tu ado . I n forme o s d ad os co r re to s . ←

" )1415 <f ieldset >16 <legend >Fo rmulá r io d e Lo gin </ legend >17 <ol >18 <li >19 @Html . LabelFor (m => m. UserName )

2 @Html . TextBoxFor (m => m. UserName )21 </ li >22 <li >23 @Html . LabelFor (m => m. Password )24 @Html . PasswordFor (m => m. Password )25 </ li >26 <li >27 @Html . CheckBoxFor (m => m. RememberMe )28 @Html . LabelFor (m => m. RememberMe , new { @class = "checkbox" })29 </ li >3 </ ol >31 <in pu t ty pe ="submit" value =" L og i n " />32 </ f ieldset >33 <p >34 @Html . ActionLink ( "Regis trar" , "Regis ter" ) .35 </ p >36 }3738 @sect io n Scr ip t s {39 @S cri pt s. Re nde r( "~/bundles / jqueryval" )4 }

Código CSHTML B.12: Login.cshtml

1 @mo del K 1 9 Cop aD o Mu n d o .Mo d els .Reg is terMo d el23 @{4 ViewBag .Title = "Cadastro" ;5 }67 < h gr o up class ="ti t le" >8 <h1 >@ViewBag.Tit le .</ h1 >9 <h2 >Cadastrar</ h2 >

1 < /h g ro u p >1112 <p c lass ="message -info" >13 S en h as d ev em t er no m in i mo @ M em b er s hi p . M i nR e qu i re d Pa s sw o rd L en g th c a ra c te r es .14 < / p >1516 @u s in g (H tml .Begin Form( ) ) {17 @ Ht ml . Val id at io nS um ma ry ( )1819 <f ieldset >2 < legend >Cadastro</ legend >21 <ol >

22 <li >23 @Html . LabelFor (m => m. UserName )24 @Html . TextBoxFor (m => m. UserName )

222 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 233/244

223 B.12. C ADASTRANDO E LISTANDO SELEÇÕES

25 </ li >26 <li >27 @Html . LabelFor (m => m. Email )28 @Html . TextBoxFor (m => m. Email )29 </ li >

3 < li >31 @Html . LabelFor (m => m. Password )32 @Html . PasswordFor (m => m. Password )33 </ li >34 <li >35 @Html . LabelFor (m => m. ConfirmPassword )36 @Html . PasswordFor (m => m. Conf irmPassword )37 </ li >38 </ ol >39 <in pu t ty pe ="submit" value ="Cadastrar" / >4 </ f ieldset >41 }4243 @sect io n Scr ip t s {44 @S cri pt s. Re nde r( "~/bundles / jqueryval" )45 }

Código CSHTML B.13: Register.cshtml

36 Adicione o seguinte partial View _LoginPartial.cshtml a pasta Shared .

1 @if (Req u est . I sA u th ent ica ted ) {2 <p >3 Olá , @ Ht ml . Ac ti on Li nk ( Us er . Id en ti ty . Name , "ChangePassword" , "Usuar io" , ←

ro u teValu es : n u ll , h tmlA tt r ib u tes : n ew { @class = "username" , t i t l e = " ←

A lter a r s en ha" }) !4 @Html . ActionLink ( "Sair" , "LogOff" , "Usuar io" )5 </ p >

6 } e lse {7 <ul >8 <li >@Html.ActionLink( "Cadastrar" , "Regis ter" , "Usuar io" , r o u teValu es : n ul l , ←

h t ml A tt r ib u te s : n ew { i d = "reg is terLink" })</ li >9 <li >@Html.ActionLink( "Entrar" , "Login" , "Usuar io" , r o u teValu es : n u ll , ←

h t ml A tt r ib u te s : n ew { i d = " loginLink" })</ li >1 </ ul >11 }

Código CSHTML B.14: _LoginPartial.cshtml

37 Altere o arquivo _Layout.cshtml .

1 <! D O CTY PE h tml>2 <h tml lang ="en" >3 <head >4 <meta ch arse t ="utf -8" />5 <title >Co pa d o Mu nd o </title >6 <l ink h r ef ="~/__TemplateIcon . ico" re l ="sh o r tcu t i con " type ="image/x- icon" />7 <meta n ame="viewpor t" conten t ="width=device-width" />8 @ St yl es . R en de r ( "~/Content/ themes/base/css" , "~/Content/css" )9 @ Sc ri pt s . Re nd er ( "~/bundles /modern izr" )

1 < / head >11 <body >12 < hea der >13 <d iv c las s ="conten t -wrapper" >14 <d iv c lass ="f loat- lef t" >15 <p c la s s ="si te- t i t le" ><img c las s ="logo" sr c ="~/Images/k19- logo . ←

jpg" al t ="K 1 9 Lo g o " /></ p >16 </ di v >17 <d iv c lass ="f loat- r igh t" >

www.facebook.com/k19treinamentos 223

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 234/244

PROJETO 224

18 < section id ="login" >19 @Html . Partial ( "_LoginPar t ia l" )2 </ sect ion >21 <nav >22 <u l i d ="menu" >

23 <li >@Html.ActionLink( "Selecoes" , "Index" , "Selecao" , n u ll ←

, n e w { @ c l a s s = "botao" })</ li >24 <li > @H tml .A c t io n Lin k ( "Jogadores" , "Index" , "Jogador" , ←

n ul l , n ew { @ c la s s = "botao" })</ li >25 </ ul >26 </ nav >27 </ di v >28 </ di v >29 </ header >3 < d iv i d ="body" >31 @ Re nde rS ect io n( "featured" , r eq ui r ed : f a l se )32 <section class ="conten t -wrapper main-conten t c lear - f ix" >33 @RenderBody ()34 </ section >35 </ di v >36 < foo ter >37 <d iv c las s ="conten t -wrapper" >38 <d iv c lass ="f loat- lef t" >39 <p >&co py ; @D ateTime .N ow.Year - K 1 9 Co p a d o Mu n d o </p >4 </ di v >41 <d iv c lass ="f loat- r igh t" >42 <u l i d ="social" >43 <li ><a h re f ="http : / / facebook.com/k19treinamentos" class =" ←

facebook" >Facebo o k - K 1 9 Tre inamen to s</ a ></ li >44 <li ><a h re f ="http : / / twit ter.com/k19treinamentos" class =" ←

twit ter" >Tw i tte r - K 1 9 Tre inamen to s</ a ></ li >45 </ ul >46 </ di v >47 </ di v >48 </ footer >49 @ Sc ri pt s . Re nd er ( "~/bundles / jquery" )5 @ Re nd er Se ct io n ( "scr ip ts" , r eq u ir ed : f a l se )51 < / body >52 < / html >

Código CSHTML B.15: _Layout.cshtml

Adicionando um Usuário Administrador com ASP .NET Conguration

Antes de denir o ltro Authorize nos controladores de nosso site, vamos criar um usuário comacesso. A maneira mais fácil de criar o usuário é através do ASP .NET Conguration .

Exercícios de Fixação

38 Execute o ASP .NET Conguration que ca na aba “Solution Explorer” do Visual Studio.

39 Isto executará um ambiente de conguração. Abra a aba “Security” e clique no link “Enableroles”.

40 Posteriormente, clique em “Create or manage roles”.

224 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 235/244

225 B.12. C ADASTRANDO E LISTANDO SELEÇÕES

41 Dena um role “Administrador” e clique Add Role .

42 Clique no botão “back” e crie um usuário.

43 Dena um usuário admin e senha admink19! .

Autorização Role-based

Podemos restringir o acesso as páginas com o ltro Authorize e podemos especicar o role queo usuário precisa ter para ter acesso a página.

Exercícios de Fixação

44 Altere o ltro de autenticação no Web.cong para redirecionar o usuário para a action Login docontrolador Usuario .

1 <au th ent ica t io n mo de= "Forms" >2 < fo rm s l og in Ur l = "~/Usuar io /Login" t imeout= "288 " / >3 < /au th en t icat io n >

Código XML B.2: Web.cong

45 Acrescente a seguinte string de conexão no arquivo Web.cong para denir o local que as infor-mações dos usuários serão armazenadas (No nosso caso, teremos duas strings de conexão).

1 <co n n ect io n St r in g s>2 <add3 name ="K19CopaDoMundoContext" providerName= "System.Data.SqlClien t"4 connectionStr ing = "Server=. \SQLEXPRESS;Database=k19copadomundo;5 User Id=sa; Password=sa;Trusted_Connection= False;Mult ip leActiveResultSets= True" />6 <! - - D e fi n in d o o p r ov e do r p ar a o M e mb e rs h ip - - >7 <add8 name ="DefaultConnection" providerName= "System.Data.SqlClien t"9 connectionStr ing = "Server=. \SQLEXPRESS;Database=k19copadomundo;

1 User Id=sa; Password=sa;Trusted_Connection= False;Mult ip leActiveResultSets= True" />11 < / c on n ec t io n St r in g s >

Código XML B.3: Web.cong

46 Acrescente o ltro de autenticação nos controladores Selecoes e Jogadores através do atributo Authorize.

1 [A u th or ize (Ro les = "Adminis trador" ) ]2 p u b l ic c lass Se lecao Con t ro l le r : Co n tro l ler

Código C# B.28: SelecaoController.cs

1 [A u th or ize (Ro les = "Adminis trador" ) ]2 p u b l ic c lass Jo g ad o rCon t ro l le r : Co n tro l ler

www.facebook.com/k19treinamentos 225

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 236/244

PROJETO 226

Código C# B.29: JogadorController.cs

Controle de ErroPodemos congurar uma página de erro padrão para ser utilizada toda vez que um erro ocorrer.

Exercícios de Fixação

47 Acrescente ao arquivo Web.cong a tag customErrors para especicar a página de erro padrão. A tag customErrors ca dentro da tag system.web .

1 <sy s tem.w eb >2 ...3 < c us to mE rr or s m od e = "On" defaultRedirect= "~/Erro /Desconhecido" >4 <error s tatusCode = "4 4" red irect= "~/Erro /PaginaNaoEncontrada" />5 </ customErrors >6 ...7 < /sy stem.w eb >

Código XML B.4: Web.cong

48 Dena o controladorErro e as páginas de erros padrão. As páginas de erro padrão serão criadas

dentro da pasta Views numa subpasta Erro .1 using System;2 using System.Collect ions .Gener ic;3 using System.Linq;4 using System.Web;5 using System.Web.Mvc;67 namespace K19CopaDoMundo.Contro l lers8 {9 p u b lic c las s Er ro Co n tro l le r : Co n tro l ler

1 {11 //12 / / G ET: /Er ro /D esco n h ecid o13

14 public ActionResult Desconhecido()15 {16 return View() ;17 }1819 //2 / / G ET: /Er ro /Pag in aN ao En co n tr ad a21 public ActionResult PaginaNaoEncontrada ()22 {23 return View() ;24 }2526 }27 }

Código C# B.30: ErroController.cs

226 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 237/244

227 B.12. C ADASTRANDO E LISTANDO SELEÇÕES

1 @{2 Layout = null ;3 }45 <! D O CTY PE h tml>

67 <html >8 <head >9 <meta n ame="viewpor t" conten t ="width=device-width" / >

1 < title >Pro b lema n o se rv id o r< / title >11 < / head >12 <body >13 <h2 >D escu lp e , t iv emo s p ro blema em n o sso se rvid o r. Vo l te d en tro d e a lg un s ←

ins tan tes .</ h2 >14 < / body >15 < / html >

Código CSHTML B.16: Desconhecido.cshtml

1 @{2 Layout = null ;3 }45 <! D O CTY PE h tml>67 <html >8 <head >9 <meta n ame="viewpor t" conten t ="width=device-width" / >

1 < title >Pág in a n ão en co nt r ada</ title >11 < / head >12 <body >13 <h2 >Pág in a n ão en con t r ada</ h2 >14 < / body >15 < / html >

Código CSHTML B.17: PaginaNaoEncontrada.cshtml

Enviando emailQuando um erro ocorre na nossa aplicação, podemos permitir que o usuário envie uma email paraos administradores do sistema. Para enviar as mensagens, podemos utilizar o Web

Exercícios de Fixação

49 Altere a tela de erro adicionando um formulário para o usuário escrever uma mensagem para osadministradores da aplicação.

1 @{2 Layout = null ;3 }45 <! D O CTY PE h tml>67 <html >8 <head >9 <meta n ame="viewpor t" conten t ="width=device-width" / >

1 < title >Pro b lema n o se rv id o r< / title >11 < / head >12 <body >

www.facebook.com/k19treinamentos 227

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 238/244

PROJETO 228

13 <h2 >D escu lp e , t iv emo s p ro blema em n o sso se rvid o r. Vo l te d en tro d e a lg un s ←

ins tan tes .</ h2 >14 <p >En vie u ma men sag em p ara o s ad minis t r ad o res d o s i s tema .< / p >15 @ us in g ( Ht ml . Be gi nF or m ( "Envia" , "Email" ) )16 {

17 <d iv c las s ="editor- label" >18 @Html . Label ( "Mensagem")19 </ di v >2 < d iv c las s ="editor- f ie ld" >21 @Html . TextArea ( "Mensagem")22 </ di v >23 <in pu t ty pe ="submit" value ="Enviar" />24 }25 < / body >26 < / html >

Código CSHTML B.18: Desconhecido.cshtml

50 Crie um controlador que envie as mensagens por email utilizando o helper WebMail. Observa-ção, utilize usuários, senhas e emails válidos do gmail para este exercício.

1 using System;2 using System.Collect ions .Gener ic;3 using System.Linq;4 using System.Web;5 using System.Web.Mvc;6 using System.Web.Helpers ;78 namespace K19CopaDoMundo.Contro l lers9 {

1 p u b lic c las s Emai lCo n tro l le r : Co n tro l ler11 {1213 public EmailContro l ler ( )14 {15 WebMail .SmtpServer = "smtp .gmail .com" ;16 WebMail .EnableSsl = true ;17 WebMail .SmtpPort = 587;18 WebMail . From = "USUARIO@gmail .com";19 WebMail .UserName = "USUARIO@gmail .com";2 WebMail .Password = "SENHA";21 }22 //23 / / PO ST: /Email /En v ia24 [ HttpPost ]25 public ActionResult Envia( string mensagem)26 {27

28 WebMail .Send ( "EMAIL", " C op a d o M u n do - E rr o ", men sag em) ;29 return View() ;3 }3132 }33 }

Código C# B.31: EmailController.cs

51 Crie uma página Envia.cshtml para mostrar ao usuário que a mensagem foi enviada com su-cesso e acrescente um link para a página inicial do site.

1 @{2 Layout = null ;3 }

228 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 239/244

229 B.12. C ADASTRANDO E LISTANDO SELEÇÕES

45 <! D O CTY PE h tml>67 <html >8 <head >

9 <title >Envia</ title >1 < / head >11 <body >12 <di v >13 Mensagem enviada com sucesso .14 </ di v >15 <di v >16 @Html . ActionLink ( "Vo l tar p a ra p ág in a in icia l " , "Index" , "Selecoes" )17 </ di v >18 < / body >19 < / html >

Código CSHTML B.19: Envia.cshtml

www.facebook.com/k19treinamentos 229

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 240/244

PROJETO 230

230 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 241/244

RESPOSTAS

A P Ê

N D I C E

CExercícioComplementar 2.1

1 using System.Data.Odbc;23 namespace Odbc4 {5 class InsereLivro6 {7 s ta tic v o id Main( string [ ] a rg s )8 {9 string s t r in gD eCo n ex ao = @"d r iv er={SQ L Server} ;

1 server=MARCELO -PC\SQLEXPRESS; database=livrar ia;u id=sa;pwd=sa;" ;1112 S yst em . Co ns ol e. Write ( " D i gi t e o T í tu l o d o L iv ro : " ) ;13 string t i tu lo = Sy s tem.Co n sole .Read Lin e( ) ;1415 S yst em . Co ns ol e. Write ( " D i gi t e o P r eç o d o L i vr o : " ) ;16 string p r eco = Sy s tem.Co n sole .Read Lin e( ) ;1718 S yst em . Co ns ol e. Write ( " D i gi t e o I d d a E d it o ra d o L i vr o : " ) ;19 string ed i to r a Id = Sy s tem.Co n sole .Read Lin e( ) ;2

21 string tex to In se reEd i tor a =22 @"IN SERT IN TO Liv ro s (Ti tu lo , P r eco , Ed i tor a Id )23 VALUES(’" + t i t u l o + @ " ’ , ’ " + p r e c o + @" ’ , " + e d it o ra I d + " )" ;2425 using (O d b cCo nn ec t io n co n ex ao = ne w OdbcConnection(s tr ingDeConexao))26 {27 OdbcCommand command = ne w OdbcCommand( tex toInsereEditora , conexao) ;28 conexao . Open () ;29 command .ExecuteNonQuery () ;3 }31 }32 }33 }

Código C# 2.9: InsereLivro.cs

ExercícioComplementar 2.3

1 using System.Data.Odbc;23 namespace Odbc4 {5 class InsereLivro6 {7 s ta tic v o id Main( string [ ] a rg s )

8 {9 string s t r in gD eCo n ex ao = @"d r iv er={SQ L Server} ;1 server=MARCELO -PC\SQLEXPRESS; database=livrar ia;u id=sa;pwd=sa;" ;

www.facebook.com/k19treinamentos 231

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 242/244

RESPOSTAS 232

1112 S yst em . Co ns ol e. Write ( " D i gi t e o T í tu l o d o L iv ro : " ) ;13 string t i tu lo = Sy s tem.Co n sole .Read Lin e( ) ;1415 S yst em . Co ns ol e. Write ( " D i gi t e o P r eç o d o L i vr o : " ) ;

16 string p r eco = Sy s tem.Co n sole .Read Lin e( ) ;1718 S yst em . Co ns ol e. Write ( " D i gi t e o I d d a E d it o ra d o L i vr o : " ) ;19 string ed i to r a Id = Sy s tem.Co n sole .Read Lin e( ) ;221 string tex to In se reEd i tor a =22 @"IN SERT IN TO Liv ro s (Ti tu lo , P r eco , Ed i tor a Id ) VA LU ES ( ? , ? , ?) " ;2324 using (O d b cCo nn ec t io n co n ex ao = ne w OdbcConnection(s tr ingDeConexao))25 {26 OdbcCommand command = ne w OdbcCommand( tex toInsereEditora , conexao) ;2728 com ma nd . Pa ram ete rs . Ad dW it hVa lu e( "@Titu lo" , t i tulo ) ;29 com ma nd . Pa ram ete rs . Ad dW it hVa lu e( "@Preco" , p r eco ) ;3 com ma nd . Pa ram ete rs . Ad dW it hVa lu e( "@EditoraId" , ed i tor a Id ) ;3132 conexao . Open () ;33 command .ExecuteNonQuery () ;34 }35 }36 }37 }

Código C# 2.14: InsereLivro.cs

ExercícioComplementar 2.5

1 using System.Data.Odbc;23 namespace Odbc4 {5 class Lis taLivro6 {7 s ta tic v o id Main( string [ ] a rg s )8 {9 string s t r in gD eCo n ex ao = @"d r iv er={SQ L Server} ;

1 server=MARCELO -PC\SQLEXPRESS; database=livrar ia;u id=sa;pwd=sa;" ;1112 using (O d b cCo nn ec t io n co n ex ao = ne w OdbcConnection(s tr ingDeConexao))13 {14 string tex to Lis taEd i tor a = " S E LE C T * F RO M L i vr o s ";15 OdbcCommand command = ne w OdbcCommand( tex toLis taEditora , conexao) ;16 conexao . Open () ;17 O db cD at aR ea de r r es ul ta do = c om ma nd . Ex ec ut eR ea de r () ;1819 while ( resu ltado .Read() )2 {21 long ? i d = r e su l ta d o [ "Id" ] a s lo ng ?;22 string t i tulo = r esu ltad o [ "Titu lo" ] a s s t r in g ;23 double ? p re c o = r e su l ta d o [ "Preco" ] as d o u ble ?;24 long ? ed i to r a Id = r esul tad o [ "EditoraId" ] a s lo ng ?;2526 System .Console .WriteLine ( " { } : { 1} - { 2} - { 3} \ n" ,27 id , titulo , preco , editoraId ) ;28 }29 }

3 }31 }32 }

232 www.k19.com.br

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 243/244

8/12/2019 (MVC 4)k19 k32 Desenvolvimento Web Com Aspnet

http://slidepdf.com/reader/full/mvc-4k19-k32-desenvolvimento-web-com-aspnet 244/244

RESPOSTAS 234

21 long ? ed i to r a Id = r esul tad o [ "EditoraId" ] a s lo ng ?;2223 System .Console .WriteLine ( " { } : { 1} - { 2} - { 3} \ n" ,24 id , titulo , preco , editoraId ) ;25 }

26 }27 }28 }29 }

Código C# 2.27: ListaLivro.cs