MVC - Ebook
MVC - Ebook
MVC - Ebook
1
SUMÁRIO
Apresentação .................................................................................................................... 5
UNIDADE 1 ........................................................................................................................ 7
1. Configurando o ambiente ........................................................................................ 7
2. Conhecendo uma aplicação ASP.NET MVC ........................................................... 15
2.1 Padrão Arquitetural MVC ................................................................................ 15
3. Criando nosso primeiro projeto ............................................................................ 18
4. Fundamentos do ASP.NET MVC – Parte 1 ............................................................. 24
4.1 Controllers (Controles) .................................................................................... 24
4.2 Action Results .................................................................................................. 26
4.3 Views (Visão).................................................................................................... 27
4.4 Action Parameters ........................................................................................... 29
4.5 Routes (Rotas).................................................................................................. 30
5. Fundamentos do ASP.NET MVC – Parte 2 ............................................................. 33
5.1 View Models (Modelos) ................................................................................... 33
5.2 Passing Data to Views ...................................................................................... 35
5.3 Razor Syntax .................................................................................................... 38
5.4 Partial Views .................................................................................................... 39
6. Considerações finais .............................................................................................. 41
UNIDADE 2 ...................................................................................................................... 42
1. Conhecendo o contexto do nosso projeto ............................................................ 42
1.1 Requisitos para o projeto do Blog pessoal ...................................................... 43
1.2 Modelagem e implementação do banco de dados ......................................... 43
2. Desenvolvendo a regra de negócio da aplicação (back-end) ................................ 46
2.1 Criando o projeto do Blog pessoal .................................................................. 46
2.2 GitHub .............................................................................................................. 47
2.3 Acessando o repositório GitHub pelo Visual Studio ........................................ 48
2.4 Desenvolvimento ............................................................................................. 49
3. Desenvolvendo a apresentação do nosso site (front-end) ................................... 54
3.1 jQuery .............................................................................................................. 54
3.2 Bootstrap ......................................................................................................... 54
3.3 Layouts e Sections ........................................................................................... 55
4. Outros recursos ..................................................................................................... 60
4.1 Validação de Model ......................................................................................... 60
4.2 Action Filters .................................................................................................... 63
2
4.3 Escolher uma tema .......................................................................................... 64
4.4 Scaffolding ....................................................................................................... 65
5. Considerações finais .............................................................................................. 67
UNIDADE 3 ...................................................................................................................... 68
1. Detalhando recursos do ASP.NET MVC ................................................................. 68
1.1 Trabalhando com Partial View......................................................................... 68
1.2 ASP.NET e SignalR ............................................................................................ 70
2. Organização do projeto ......................................................................................... 71
2.1 Camada de negócio (Business Logic Layer) ..................................................... 71
2.2 Camada de acesso a dados (Data Access Layer) ............................................. 78
2.3 Camada de apresentação (User interface/Presentation) ............................... 82
2.4 ValidateAntiForgeryToken ............................................................................... 92
2.5 Configurações no Web.config.......................................................................... 93
2.6 Controle de transação por meio do Unit Of Work .......................................... 94
2.7 Outros assuntos de segurança ........................................................................ 94
3. Desempenho da aplicação ...................................................................................... 96
3.1 Compactação da requisição com a compressão GZIP e Deflate ..................... 96
3.2 Filtro para remoção de espaços ...................................................................... 98
3.3 Bundle e Minification..................................................................................... 100
3.4 Cache ............................................................................................................. 104
3.5 Cookie ............................................................................................................ 106
3.6 Chrome Developer Tool ................................................................................. 107
3.7 Desempenho em consultas ........................................................................... 108
3.8 Content Delivery/Distribution Network (CDN) .............................................. 113
4. Considerações finais ............................................................................................ 114
UNIDADE 4 .................................................................................................................... 115
1. Internet Information Services (IIS) ...................................................................... 115
1.1 Gerenciador do Serviços de Informação da Internet (IIS) ............................. 116
2. Microsoft Azure ................................................................................................... 121
2.1 Application Insights ....................................................................................... 126
3. Qualidade do projeto e outros assuntos importantes ........................................ 128
3.1 Rollbar ............................................................................................................ 128
3.2 Search Engine Optimization (SEO) ................................................................. 129
3.3 ASP.NET Web API ........................................................................................... 132
4. Certificações Microsoft ........................................................................................ 134
3
5. Dicas e materiais .................................................................................................. 136
6. Considerações finais ............................................................................................ 138
4
Apresentação
Olá, pessoal. Tudo bem? Espero que sim, meu nome é João Vitor Ferrari da
Silva e serei o professor da disciplina Desenvolvimento Web com ASP.NET MVC -
Módulo I, da Especialização EAD em Arquitetura de Soluções em Plataforma.Net (C#).
Sou tecnólogo em Análise de Sistemas, possuo uma especialização em Engenharia de
Software e sou mestre em Informática na área de Inteligência Computacional, além de
ser um Profissional Certificado da Microsoft1 (MCP).
Iniciei na área de desenvolvimento de software em 2008 e até hoje trabalho
utilizando o ambiente de desenvolvimento da Microsoft juntamente com a Linguagem
de programação C# (C-Sharp). São mais de 10 anos de experiência adquirida por meio
da formação acadêmica, do trabalho em algumas empresas que já passei, de
dedicação e principalmente da troca de conhecimento entre outros desenvolvedores.
No começo trabalhei com codificação de aplicações desktop, conhecido por
Windows Forms2, porém não demorou muito para iniciar o desenvolvimento de
aplicações web, no início com framework ASP.NET WebForms3 até chegar ao
framework ASP.NET MVC4, tecnologia que trabalho desde 2012.
Na disciplina Desenvolvimento Web com ASP.NET MVC - Módulo I
aprenderemos como desenvolver sistemas na estrutura MVC utilizando todos os
recursos disponíveis pelo framework. Mostraremos passo a passo a codificação do
projeto, iremos desde a definição da estrutura até a publicação do nosso sistema,
sempre apresentando as boas práticas para o desenvolvimento. Trabalharemos com
banco de dados SQL Server, utilizaremos Entity Framework e Dapper para consultas,
conheceremos testes de unidade, padrões de projeto e ferramentas que nos auxiliam
em cada processo do desenvolvimento. Ao final da disciplina você estará apto a
desenvolver um sistema web com conexão ao banco de dados do zero utilizando
ASP.NET MVC.
Nosso material será organizado em 5 módulos. No primeiro módulo
abordaremos a configuração do ambiente de desenvolvimento e as ferramentas que
utilizaremos durante toda a disciplina, além de construirmos nossa primeira aplicação
com ASP.NET MVC. Já no segundo módulo iniciaremos o trabalho com dados em nossa
aplicação MVC. No terceiro módulo aprenderemos como organizar melhor nosso
projeto e discutiremos algumas boas práticas. O módulo quatro apresenta a questão
de segurança, desempenho e integrações da nossa aplicação web. Por fim, no quinto
módulo aprenderemos como publicar uma aplicação ASP.NET MVC e outras dicas para
que você conheça um pouco mais sobre como melhorar seu sistema web.
Durante a leitura deste livro, quando existir necessidade deixarei no rodapé da
página alguma referência ou descritivo sobre termos destacados pelos capítulos com a
finalidade de detalhamento, caso tenha alguma possível dúvida ou interesse de
aprofundar um pouco mais em outros assuntos.
Como pré-requisito para esta disciplina, precisaremos conhecer o básico de C#
e ter muita vontade de aprender. Quero te ajudar nesta caminhada para sermos
1 https://www.microsoft.com/pt-br/learning/microsoft-certified-professional.aspx
2 https://docs.microsoft.com/pt-br/dotnet/framework/winforms/
3 https://docs.microsoft.com/pt-br/aspnet/web-forms/
4 https://docs.microsoft.com/en-us/aspnet/mvc/
5
desenvolvedores melhores. Caso queira me acompanhar, adicione-me para trocarmos
algumas figurinhas e mantermos contato:
• LinkedIn: https://www.linkedin.com/in/joao-vitor-ferrari-da-silva-
70685526/;
• GitHub: https://github.com/poferrari;
• Email: dev.londrina@uniciv.com.br.
Até as aulas!
6
UNIDADE 1
Nossa primeira aplicação ASP.NET MVC
O desenvolvimento web se modificou e introduziu inúmeras novidades, como:
novas técnicas de codificação, tags, ferramentas e revelou a ampla capacidade do que
o JavaScript pode fazer.
A plataforma ASP.NET vem evoluindo para acompanhar o desenvolvimento
web. Nesse contexto, a Microsoft desenvolveu um framework para desenvolvimento
de aplicações Web, chamado ASP.NET MVC.
O ASP.NET MVC permite que os desenvolvedores tenham maior controle sobre
código desenvolvido, é uma tecnologia mais leve e mais eficiente do que o outro
framework de desenvolvimento web da plataforma ASP.NET, chamado ASP.NET Web
Forms. Esta flexibilidade, proporciona ao programador uma liberdade para codificar da
maneira que seja melhor para seu processo de desenvolvimento.
O framework ASP.NET MVC permite a utilização da linguagem C#.
1. Configurando o ambiente
As aulas serão apresentadas em um ambiente Microsoft, utilizando o sistema
operacional Windows 10. Para o desenvolvimento será feito o uso da IDE da Microsoft,
o Visual Studio Community 2017, juntamente com algumas extensões que auxiliam na
codificação. A linguagem de programação abordada em nossas aulas será C#.
Conceitos técnicos de programação, do framework, da ferramenta e mesmo da
linguagem, sempre que forem utilizados, serão introduzidos e exemplificados.
Antes de começarmos é interessante conhecer as edições disponíveis do Visual
Studio, conforme apresenta a Figura 1. O Visual Studio Community é a IDE gratuita
para estudantes, por esse motivo que iremos utilizá-la em nossas aulas. Já o Visual
Studio Professional e o Visual Studio Enterprise são edições pagas, o que difere entre
elas é que na edição Enterprise encontra-se mais funcionalidades para auxiliar o
desenvolvimento do que a edição Professional. Por fim, o Visual Studio Code é uma
ferramenta gratuita, de código aberto e que roda em outros sistemas operacionais.
7
Figure 1: Diferentes edições da IDE do Visual Studio. Fonte: Adaptado de [26].
8
Figure 2: Opções de instalação do Visual Studio, categoria Windows e Web & Cloud.
Figure 3: Opções de instalação do Visual Studio, categoria Mobile & Gaming e Other
Toolsets.
9
Figure 4: Notificação de atualizações do Visual Studio 2017.
10
processo de desenvolvimento;
• Visual Studio Spell Checker: realiza a verificação ortográfica do site;
• Power Commands for Visual Studio: adiciona ações que basicamente
combinam várias funcionalidades que são executadas com apenas um clique;
• SonarLint for Visual Studio 2017: fornece aos desenvolvedores feedback
em tempo real sobre a qualidade do código. Pode detectar problemas em segundos, o
que melhora a produtividade;
• ReSharper: ferramenta que aumenta a produtividade do desenvolvedor,
pois ele automatiza a maior parte do que pode ser automatizado em suas rotinas de
codificação. Ela encontra erros de compilador, erros de tempo de execução,
redundâncias e problemas de código à medida que você digita, sugerindo correções
inteligentes para eles. É uma extensão paga, porém há disponibilidade de testar por 30
dias;
• Roslynator 2017: possui 400 analisadores que auxiliam nas refatorações e
correções de código para o C#, é uma extensão que provavelmente chegará ao mais
próximo do ReSharper de graça;
• GitHub Extension for Visual Studio: facilita a conexão e o trabalho com os
repositórios no GitHub.
• SQL Server Enterprise: é uma edição paga e mais robusta, não possui
limitações de recurso;
• SQL Server Standard: é uma edição paga com algumas limitações de
recurso;
• SQL Server Express: é uma edição gratuita, possui bastantes limitações,
porém permite desenvolver aplicações comerciais;
• SQL Server Developer: é uma edição gratuita, disponibiliza vários recursos
que são encontrados nas versões Standard e Enterprise, porém não permite que seja
utilizado com fins comerciais, apenas para estudo.
11
Figure 6: Edições do Microsoft SQL Server 2017.
Para elaboração da aula será utilizada a versão SQL Server 2017 Express, por
ser uma versão gratuita do SQL Server. No próprio site da ferramenta é descrito ser
ideal para desenvolvimento e produção de aplicativos de área de trabalho, Web e
pequenos servidores. O objetivo é deixar um ambiente de desenvolvimento
completamente pronto para que seja possível desenvolver ferramentas que possam
ser disponibilizadas para fins educacionais ou comerciais.
O download do Microsoft SQL Server 2017 Express é encontrado por meio do
seguinte endereço:
https://www.microsoft.com/en-us/download/details.aspx?id=55994
Para criarmos nosso banco de dados utilizaremos o SQL Server Express LocalDB,
recurso voltado a desenvolvedores, que é uma versão leve do Express e que possui
todos os seus recursos de programação. Ele é executado no modo de usuário e tem
uma instalação rápida e sem nenhuma configuração e uma lista curta de pré-requisitos
(Microsoft).
Segundo a Microsoft, depois do LocalDB ser instalado, você poderá iniciar uma
conexão usando uma cadeia de conexão especial. Ao conectar, a infraestrutura
necessária do SQL Server é criada e iniciada automaticamente, permitindo que o
aplicativo use o banco de dados sem tarefas de configuração complexas.
12
Figure 7: Acesso ao LocalDB por meio do Microsoft SQL Server Managemenet Studio.
Fonte: Autoria própria.
5 https://github.com/
13
O Azure DevOps6, antigamente conhecido por Visual Studio Team System
(VSTS), é um conjunto de aplicativos que auxiliam durante todo o ciclo de vida de
desenvolvimento. Vale citar que você pode disponibilizar seu código por meio deste
sistema também, pois a Microsoft libera um acesso gratuito, porém com algumas
limitações, como por exemplo, a quantidade de usuários que podem ser adicionados
no seu projeto.
Para criar sua conta gratuita, você precisará de uma conta da Microsoft e
acessar a seguinte URL: https://aka.ms/azdev-signin. Iremos abordar as
funcionalidades deste sistema com mais detalhes durante os próximos módulos, você
aprenderá como realizar a gestão do seu projeto, a automatizar algumas rotinas de
trabalho e a organização dos times por meio do Azure DevOps, além de outras
funcionalidades que te auxiliarão em um fluxo de trabalho.
6 https://azure.microsoft.com/pt-br/services/devops/
14
2. Conhecendo uma aplicação ASP.NET MVC
Antes de iniciarmos nossa aplicação ASP.NET MVC, precisamos conhecer a
arquitetura de uma aplicação web do tipo Cliente Servidor. A Figura 8 demonstra como
funciona a comunicação de uma aplicação nesta arquitetura. Pela imagem, pode-se ver
o bloco com o título “User Worksation”, ele representa o acesso do usuário por meio
de um navegador via requisição HTTP (HTTP request), sendo realizado este acesso por
qualquer tipo de dispositivo com browser.
A requisição enviada pelo cliente é submetida ao servidor, no caso da figura
representado pelo bloco do título “Web Server”. É no servidor que a requisição
solicitada será processada e ao final enviará uma resposta ao cliente por meio de uma
resposta via HTTP (HTTP response). É o servidor que possui a comunicação com o
banco de dados e fica responsável por realizar os processos mais pesados da aplicação,
ele recebe requisições de vários clientes diferentes. Já o cliente deve ter uma
comunicação rápida pois tem relação com a experiência do usuário, trabalha
principalmente com HTML (HyperText Markup Language), JavaScript e CSS (Cascading
Style Sheets).
15
• Model: são as partes da aplicação que implementam a lógica para o
domínio de dados da aplicação, além de retornar e armazenar o estado do modelo no
banco de dados [16];
• View: são os componentes que exibem a interface do usuário (UI), em geral
é criada a partir do modelo de dados [16];
• Controller: são os componentes que tratam com a interação do usuário,
trabalham com o modelo e selecionam uma visão para ser exibida. Em uma aplicação
MVC, a view somente exibe informação, o controller trata e retorna a entrada do
usuário e a interação [16].
16
Development (TDD);
• facilidade de integração no lado do cliente com JavaScript, jQuery, JSON,
entre outros;
• permite usar a arquitetura RESTful;
• torna a aplicação escalável;
• é possível ter desenvolvimento em paralelo para o model, view e controller
pois são independentes;
• comunidade ativa trabalhando nesta tecnologia.
17
3. Criando nosso primeiro projeto
Após toda a instalação e configuração do ambiente, criaremos uma aplicação
padrão do ASP.NET MVC. O objetivo aqui é apresentar o Visual Studio e as ferramentas
disponíveis para se trabalhar com ASP.NET MVC, além de mostrar toda a estrutura do
projeto, para que possamos assimiliar os conceitos e teorias estudadas até agora.
O primeiro passo será criar nosso primeiro projeto ASP.NET MVC, por meio do
Visual Studio. Desse modo, pelo menu superior, acesse a seguinte sequência de
opções: “File”, “New” e “Project”, após, será apresentada a tela de seleção para
escolher o tipo de projeto, representada pela Figura 10. Na janela que é apresentada,
na parte esquerda, que traz os templates disponíveis (modelos), selecione a linguagem
Visual C# e, dentro desta categoria a opção Web (1).
Figure 10: Janela do Visual Studio para criação de um novo projeto web ASP.NET MVC.
Seguindo pela Figura 10, na área central, marque a opção ASP.NET Web
Application (.NET Framework) (2). Na parte inferior da janela (3), informe: (i) o nome
do projeto, (ii) a localização em que ele ficará armazenado em sua máquina, (iii) o
nome da solução que irá abranger todos os demais projetos, e (vi) a versão do .NET
Framework que será utilizada, que em nossos exemplos será a versão 4.6. Caso você
tenha uma conta no AzureDevops, e queria que o projeto seja adicionado
automaticamente para controle de versão e uso das demais ferramentas disponíveis,
basta clicar em “Add to Source Control”. Clique no botão OK para dar sequência ao
18
processo.
Na nova janela que se abre é preciso selecionar qual template de uma
aplicação web deverá ser criado. Uma boa prática é selecionar a opção Empty, porém
como é a nossa primeira aplicação, iremos selecionar a opção MVC (1), verifique que
ao selecionar este template a opção MVC (2) ficou marcada automaticamente.
Verifique que nesta tela há a opção para criar um projeto de teste, mantenha como
padrão em seu desenvolvimento a prática de testes, desse modo, recomenda-se a
seleção desta opção (3). Verifique se sua janela está conforme a Figura 11. Clique no
botão OK para confirmar a seleção e o projeto será criado.
19
Figure 12: Estrutura inicial do projeto ASP.NET MVC no Visual Studio.
No ASP.NET MVC, uma requisição é direcionada a uma Action por meio de uma
rota. A Action é um método de uma classe que representa um determinado
controlador. O Controller é uma classe que representa um determinado Modelo de sua
aplicação. É no Controller que são desenvolvidas as Actions [2].
20
Figure 13: Copilando o projeto ASP.NET MVC no Visual Studio.
Antes de executar nosso projeto, precisamos setar nossa aplicação web como
projeto que será iniciado pela solução. Para isso, basta acessar a janela do “Solution
Explorer", selecionar o projeto web, botão direito do mouse e clicar na opção “Set as
StartUp Project" (1), verifique que o nome do projeto ficará em destaque, a Figura 13
demonstra a tarefa realizada.
Por fim, vamos executar o projeto, para isso podemos acessar o menu de
atalhos do Visual Studio e clicar a seta verde (2) (você pode utilizar a tecla F5 como
atalho para executar esta tarefa), ou pode acessar o menu superior do Visual Studio, a
opção “Debug" (3) e clicar na opção “Start Debugging" (atalho F5) ou “Start Without
Debugging (atalho Ctrl + F5)". A Figura 13 apresenta as configurações para executar
nosso projeto.
Uma página web carregada pelo browser deve aparecer para você. Desse
modo, você acabou de criar e publicar localmente, sua primeira aplicação ASP.NET
MVC. Vamos aproveitar para fazer uma pequena modificação, a fim de já conhecermos
melhor nossa estrutura.
Na tela “Solution Explorer", navegue até o arquivo “HomeController"
(localizado em: MinhaPrimeiraAplicacao.Web > Controllers > HomeController). No
método Index, que representa uma action. Faremos a seguinte alteração:
adicionaremos uma mensagem na página inicial. Adicione o seguinte trecho de código:
ViewBag.Message = “Minha primeira aplicação com ASP.NET MVC.", conforme
apresentado pela Figura 14.
21
Figure 14: Adicionando um texto na Action Index da Controller Home.
22
Figure 16: Primeira aplicação ASP.NET MVC funcionando e apresentando a mensagem
desenvolvida.
23
4. Fundamentos do ASP.NET MVC – Parte 1
Neste capítulo, aprenderemos os principais recursos do ASP.NET MVC.
Saberemos como criar uma Controller, construiremos Actions e visualizaremos os
diferentes tipos de retornos que existem, implementaremos Views e conheceremos a
sintaxe do Razor, além de vários outros recursos disponíveis pelo framework.
Também conheceremos algumas das convenções utilizadas pela configuração
do framework ASP.NET MVC, em que estas visam simplificar e diminuir as decisões que
precisam ser tomadas pelo desenvolvedor. O trabalho fica muito mais fácil e simples já
que algumas decisões estruturais e de nomes são sugeridos ou até exigidos em alguns
casos [23].
Para criar nosso Controller, basta acessar a tela “Solution Explorer", clicar com
24
o botão direito do mouse sobre a pasta Controllers e clicar na opção Add > Controller,
conforme demonstra a Figura 17. Na janela seguinte serão apresentados vários
templates de Controllers. Pela Figura 18, visualizamos que são apresentados templates
de Controller do MVC 5, que é o objeto do nosso estudo, e também de Web API 2, que
será futuramente estudado em outra disciplina. No nosso caso selecionaremos o
template MVC 5 Controller - Empty. Para iniciar o processo de criação do Controller,
clique no botão Add.
25
CategoriasDeProdutoController herda da classe Controller, é necessária essa herança
por características do framework. Repare na Action Index, as actions devem ser public,
para que possam ser invocadas naturalmente pelo framework ASP.NET MVC, e não
podem ser static, pois elas pertencerão a cada controlador instanciado.
Table 1: Tabela com os principais tipos de retorno da classe ActionResult. Fonte: [12].
Classe derivada de
Descrição Exemplo
ActionResult
ViewResult Retorna uma View return View();
PartialViewResult Retorna especificamente return PartialView();
uma Partial View
RedirectResult Redireciona para uma URL return Redirect("URL");
específica
RedirectToRouteResult Redireciona para outra return
Action RedirectToAcion("Action",
"Controller");
ContentResult Retorna texto puro (string) return Content("Texto",
"texto puro");
JsonResult Retorna um JSON return Json(objeto);
EmptyResult Retorna uma resposta vazia return EmptyResult();
FileResult Retorna um arquivo return File("caminho do
arquivo", "application/pdf");
26
HttpStatusCodeResult Retorno HTTP escolhido pelo X
desenvolvedor
Logo em seguida, abrirá uma janela em que iremos informar mais detalhes
sobre a View que será criada. A Figura 22 representa este processo, veja que no campo
“View Name" já veio preenchido com o nome Index, mesmo nome da nossa Action
criada em CategoriasDeProdutoController.
27
Figure 22: Detalhes para criação da View.
Figure 23: Código da View criada para retorno da Action Index do Controller
CategoriasDeProdutoController.
Na View, você pode modificar o HTML gerado pelo Visual Studio (1), além de
28
utilizar todas as funcionalidades que o Razor nos proporciona (iremos detalhar esta
tecnologia na Subseção 5.3). Repare pela Figura 23, que a convenção da View deve ser
seguida (2), logo depois da pasta Views, temos outra pasta com o nome do Controller
(CategoriasDeProdutoController) e dentro dele temos nossa View Index.
Outra maneira para trabalharmos com parâmetros é por meio do Model Class
Object, na qual você pode criar uma classe responsável para informar seus valores,
representada pela Figura 25, e a conversão de valores é feita de maneira automática,
conforme ilustre a Figura 26. Para realizar o cenário ilustrado pela imagem, basta você
acessar o Controller CategoriasDeProdutoController e alterar sua Action Teste, neste
método altere o parâmetro id pela classe de Filtro, e depois acesse sua Action pela
seguinte rota: http://localhost:xxxx/CategoriasDeProduto/Teste?id=22.
29
Podemos utilizar FormCollection para receber os parâmetros informados em
um formulário, conforme exemplifica a Figura 27. Já na Action, iremos acessar os
parâmetros informados no formulário da View, ilustrada pela Figura 28. Para realizar o
cenário ilustrado pela imagem, basta você acessar o Controller
CategoriasDeProdutoController e adicionar uma Action Index com atributo [HttpPost],
neste método adicione o parâmetro FormCollection, executa sua aplicação e depois
acesse sua Action pela seguinte rota:
http://localhost:xxxx/CategoriasDeProduto/Index, preencha o formulário e envie sua
requisição por meio do botão Salvar.
30
As configurações das rotas são centralizadas na classe RouteConfig, localizada
em: MinhaPrimeiraAplicacao.Web > App_Start > RouteConfig.cs, é recomendado que
se mantenha o padrão definido pelo ASP.NET MVC, mas há casos que precisaremos
alterar as rotas para atender outras necessidades, como por exemplo, a indexação de
uma página pelos motores de busca de sites de pesquisa (Google, Bing, Baidu etc.), por
meio de URL amigável, mas esta parte será detalhada em outro capítulo. O código
desta classe pode ser visto pela Figura 29.
31
Figure 31: Navegação baseada em Rotas passando parâmetros.
Note pela Figura 29, que o redirecionamento das URLs citadas para mesma
página acontece por meio da implementação routes.MapRoute() para a rota Default
(name: "Default"), na qual temos a seguinte atribuição do valor Home para o atributo
Controller (controller = "Home"), do valor Index para o atributo Action (action =
"Index"), e, por fim, do valor UrlParameter.Optional para o atributo id (id =
UrlParameter.Optional).
Estas configurações da classe RouteConfig, que possibilitam no exemplo da
Figura 30, o uso da Action Index por valor default, no caso de omissão do parâmetro, e
como não for enviado um terceiro argumento, que seria o id, nada é utilizado como
padrão, pois ele é configurado como opcional. Já no exemplo da Figura 31, verifica-se a
interpretação do parâmetro id por Query String.
32
5. Fundamentos do ASP.NET MVC – Parte 2
Neste capítulo, aprenderemos outros recursos do ASP.NET MVC.
Aprenderemos como criar uma Model, como trabalhar com os dados na View e
também como criar uma Partial View, entre outras funcionalidades.
Pela Figura 32, há vários recursos que podem ser adicionados ao projeto. No
nosso caso, iremos adicionar uma nova classe, para isso iremos navegar até o opção
“Visual C# > Code" (1), esta ação irá filtrar os recursos disponíveis para nossa seleção,
escolha opção “Class" (2), e por último, daremos o nome “CategoriaDeProduto.cs" (3)
para nossa classe. Pronto, nosso modelo está criado.
Vamos adicionar as seguintes propriedades em nossa classe
CategoriaDeProduto: (i) Id, (ii) Nome e (iii) Descrição. Conforme código a seguir:
style=sharpc public class CategoriaDeProduto public int Id get; set; public string33
Nome get; set; public string Descricao get; set;
Faremos a seguinte alteração em nossa View Index da CategoriaDeProduto
(localizada em MinhaPrimeiraAplicacao.Web > Views > CategoriasDeProduto > Index),
conforme apresenta a Figura 33. Adicionaremos os inputs do HTML para informar as
propriedades da classe CategoriasDeProduto.
34
Figure 35: Apresentação da View para cadastro de CategoriaDeProduto.
Até agora aprendemos como receber dados da View para utilizarmos em nosso
Controller. Dessa forma, vamos descobrir como passamos nossos dados da Model para
View por meio do Controller. Há diferentes maneiras de conseguir isso e iremos
detalhar a seguir.
Primeiramente vamos conhecer ViewBag, já vimos este cara no material, mas
não tivemos a oportunidade de detalhar este recurso. Ele é utilizadas para persistir
dados entre a Controller e a View correspondente, possui uma duração de “tempo de
vida" exclusivo entre o envio através da Controller e a exibição na View, depois disso
torna-se nula novamente. Caso utilize algum Action Result de Redirect, a ViewBag
também se tornará nula [19].
As característica da ViewData se assemelham aos da ViewBag, na qual se
35
diferem da seguinte forma: enquanto a ViewData é um dicionário de objetos derivado
de ViewDataDictionary e é acessível utilizando strings como chaves, além de requerer
conversão quando associada a tipos complexos. A ViewBag é uma propriedade
dinâmica baseada na funcionalidade “dynamic" e não há necessidade de conversão
para tipos complexos [19].
A figura 36 demonstra o código de como passar dados por meio de ViewBag e
de ViewData. Veja que na ViewBag você cria a propriedade Categoria dinamicamente,
já na ViewData precisa criar uma chave e atribuir o valor desejado.
Pela figura 37 visualizamos como obter os dados passados pela Action. Perceba
que pelo recurso ViewData foi necessário realizar a conversão do objeto, já por
ViewBag não há esta necessidade de conversão. Recomenda-se o uso por meio de
ViewBag.
36
Figure 38: Ciclo de vida do TempData. Fonte: [27].
37
@model CategoriaDeProduto, não esqueça de referenciar a classe por meio do using.
Depois de definida, podemos acessar nosso modelo por meio do: @Model, e
consequentemente as propriedades da classe CategoriaDeProduto.
O ASP.NET Razor é uma view engine, é uma sintaxe de script que simplifica a
maneira como nós codificamos as aplicações ASP.NET. É uma ferramenta para geração
de visões que possibilita a inserção de lógica da aplicação nas Views. Sua sintaxe é
simplificada e tem como base a linguagem de programação C#.
Razor não é uma linguagem, mas sim um recurso do ASP.NET. Ele nós traz
alguns benefícios [13], como:
Pela figura 41, vimos que a inserção de código deve ser precedida do caractere
@ (1), e blocos de código devem estar delimitados por e (2). Dentro de um bloco,
cada instrução deve ser finalizada com ; (ponto e vírgula), e é possível fazer uso de
variáveis para armazenamento de valores. Veja que o @Html.EditorFor renderiza a tag
input quando iniciamos nossa aplicação, outros recursos serão detalhados nos
módulos a seguir, porém caso queira conhecer um pouco mais, recomendo a leitura da
seguinte URL: https://msdn.microsoft.com/pt-br/magazine/mt845651.aspx.
38
Figure 41: Sintaxe Razor para codificação da View.
Com Razor o código da View fica mais fácil de digitar, mais simples e legível.
Razor possui Helpers que são ferramentas que facilitam o desenvolvimento de alguns
recursos, como Chart, que é responsável por processar um gráfico. Outros Helpers
serão detalhados nos próximos Módulos.
39
Figure 42: Criando uma Partial View para listar as opções de menu.
Com a implementação da Partial View concluída, precisamos fazer uso dela. Por
exemplo, chamaremos ela em nossa View Index da CategoriaDeProduto, por meio do
código: @Html.Partial("_Menu"), conforme demostra a figura 44.
40
6. Considerações finais
Neste módulo entendemos o papel do padrão MVC no framework ASP.NET
MVC, em que o controller está no comando e tem a responsabilidade de decidir quais
models usar e quais views transmitir de volta para o usuário. O controller está a cargo
da coordenação e é o primeiro a ser executado quando a requisição web chega à
aplicação. O controller é responsável por decidir qual resposta é apropriada para a
requisição do usuário [17].
Já a view é responsável apenas por apresentar a interface do usuário. Ao
separar a lógica de domínio e desacoplar da view, o acesso aos dados e a outras
chamadas a interface do usuário podem permanecer igual, mesmo quando a lógica e o
acesso aos dados mudam dentro da aplicação. Por fim, o controller possui uma relação
direta com a view e a model, mas a model não precisa saber nada a respeito do
controller ou da view [17].
Recomendo a leitura do seguinte tutorial da Microsoft que detalhada cada
recurso do ASP.NET MVC 5, acesse a URL: https://docs.microsoft.com/en-
us/aspnet/mvc/overview/getting-started/introduction/.
Este módulo foi um pouco mais extenso e detalhado pois precisamos alinhar o
conhecimento de todos os alunos. Há alunos que só tiveram o primeiro contato com o
Visual Studio e o ASP.NET MVC agora, já há outros que conhecem toda ferramenta,
mas, às vezes, não conhecia cada detalhe dos recursos que foram apresentados. Os
próximos módulos serão focados mais no código que iremos desenvolver, porém todos
os conceitos serão totalmente explicados e exemplificados.
41
UNIDADE 2
Trabalhando com dados
Neste módulo iniciaremos um projeto do zero, conheceremos novos recursos
que ainda não foram abordados, e detalharemos os que já foram apresentados.
Trabalharemos com os dados em nossa aplicação por meio do SQL Server e
aprenderemos a trabalhar com GitHub no Visual Studio.
7 https://getbootstrap.com/
8 https://jquery.com/
42
Figure 45: Tecnologias utilizadas na aplicação. Fonte: [5]
43
Após entendermos nossa necessidade, podemos modelar nosso banco de
dados. Esta modelagem será a representação do domínio da nossa aplicação, no qual
nos basearemos para implementação das classes de negócio no ASP.NET MVC.
Para realizar a modelagem em modo gráfico, podemos utilizar o próprio SQL
Server Management Studio, conforme demonstra o Diagrama Entidade
Relacionamento (DER) do nosso projeto de Blog Pessoal, representada pela figura 46.
44
style=sql USE BlogSimples
CREATE TABLE dbo.[autor] ( id int IDENTITY NOT NULL, nome varchar(150) NOT
NULL, email varchar(150) NOT NULL, senha varchar(50) NOT NULL, administrador bit
DEFAULT(0) NOT NULL, data_cadastro datetime DEFAULT(GETDATE()) NOT NULL,
CONSTRAINT PK_autor PRIMARY KEY (id), CONSTRAINT UQ_email_autor UNIQUE
(email), ) GO
CREATE TABLE dbo.[categoria_artigo] ( id int IDENTITY NOT NULL, nome
varchar(150) NOT NULL, descricao varchar(300) NULL, CONSTRAINT PK_categoria_artigo
PRIMARY KEY (id), CONSTRAINT UQ_nome_categoria_artigo UNIQUE (nome), ) GO
CREATE TABLE dbo.[artigo] ( id int IDENTITY NOT NULL, titulo varchar(300) NOT
NULL, conteudo varchar(MAX) NOT NULL, data_publicacao datetime NOT NULL,
categoria_artigo_id int NOT NULL, autor_id int NOT NULL, removido bit DEFAULT(0) NOT
NULL, CONSTRAINT PK_artigo PRIMARY KEY (id), CONSTRAINT
FK_artigo_categoria_artigo_id FOREIGN KEY (categoria_artigo_id) REFERENCES
dbo.[categoria_artigo] (id), CONSTRAINT FK_artigo_autor_id FOREIGN KEY (autor_id)
REFERENCES dbo.[autor] (id) ) GO
45
2. Desenvolvendo a regra de negócio da aplicação (back-
end)
Nesta seção, abordaremos a criação do nosso projeto ASP.NET MVC, com foco
nas responsabilidades do back-end. Inciaremos nosso estudo sobre Entity Framework
e aprenderemos a utilizar o GitHub como repositório do web site.
Iniciaremos pela criação do nosso projeto ASP.NET MVC com o Visual Studio
2017 por meio do menu: File > New > Project. Dentro da categoria Web, selecione o
template ASP.NET Web Application (.NET Framework), atribua como nome do projeto
“BlogPessoal.Web” e para o nome da solução “BlogPessoal”, este processo é ilustrado
pela figura 47.
46
Figure 48: Configurando o template do nosso Blog Pessoal.
2.2 GitHub
Iremos utilizar o GitHub como repositório para o nosso projeto. Caso você não
tenha conta ainda, é interessante que seja criada uma conta. Para projetos de código
aberto, não há custo nenhum, acesse: https://github.com/
Depois, criaremos um repositório remoto, que ficará disponível para todos da
internet. Para isso, clique no botão “New Repository”. No Repository name, devemos
preencher o nome do repositório remoto. No nosso caso, vamos preencher com
“asp.net-mvc-blog-simples”. Deixe o repositório como Public, para que qualquer
pessoa consiga ver o seu código. As demais opções podem ficar com os valores padrão.
Finalmente, devemos clicar em Create repository. A figura 49 ilustra todo este
processo.
47
Figure 49: Criando repositório no GitHub.
Pronto, seu repositório foi criado com sucesso. Nesse contexto, podemos
trabalhar com o Git em linha de comando, porém para utilizar o modo gráfico
precisaremos instalar a aplicação do GitHub para nosso ambiente Windows, faça o
download pela URL: https://gitforwindows.org/.
O código fonte da aplicação que construiremos pode ser encontrado no
GitHub, acesse: https://github.com/poferrari/asp.net-mvc-blog-simples. Utilize
sempre que necessário para referência nos estudos e, caso queira, fique à vontade
para contribuir com o código fonte, faça um fork e envie seu pull request.
Pelo Visual Studio, acesse a tela “Team Explorer - Connect”, selecione a opção
GitHub. Use a opção para clonar o projeto remoto para sua máquina, escolhendo uma
pasta. Após, adicione o projeto já criado.
Por meio do prompt de comandos (Git Bash), executaremos a seguinte
sequência de comandos:
48
1. git status: para verificarmos as alterações realizadas no repositório;
2. git add .: irá realizar as alterações notificadas no repositório;
3. git commit -m "comentário qualquer": confirma alterações realizadas;
4. git push: envia as alterações realizadas para o repositório remoto;
5. git pull: atualiza o seu repositório local com as atualizações do repositório
remoto.
2.4 Desenvolvimento
style=sharpc public class CategoriaDeArtigo public int Id get; set; public string
Nome get; set; public string Descricao get; set;
2.4.1 Nuget
49
Figure 50: Apresentando o Package Manager Console.
Figure 51: Instalando o Entity Framework por meio do Package Manager Console.
Há outra maneira para instalar bibliotecas, conforme ilustra a figura 52. Veja
que ao selecionar o projeto e clicar com o botão direito, depois selecionar na opção
50
“Manage Nuget Packages”, aparecerá a tela para pesquisar pacotes, listar os já
instalados e atualizações destes por meio do Nuget.
Figure 52: Instalando o Entity Framework por meio do Nuget Package Manager.
51
Figure 53: Mapeamento objeto relacional. Fonte: [14]
Com o uso do Entity Framework, o código fonte torna-se mais fácil de ser
compreendido, facilitando a manutenção do sistema. O desenvolvimento utilizando
este framework acontece de forma acelerada, ou seja ganhamos produtividade, pois
não é necessário digitar comandos SQL para inserção, alteração, remoção e seleção.
Nesse contexto, será utilizado o Entity Framework para integrar os serviços
criados com o banco de dados que será gerado pela nossa aplicação. Dessa forma,
serão desenvolvidos serviços muito mais interessantes, complexos e elaborados.
No site da Microsoft está disponível a documentação do Entity Framework,
acesse a seguinte URL https://docs.microsoft.com/pt-br/ef/ef6/get-started.
Para o projeto Blog Pessoal, precisaremos criar nosso Contexto. Ele é
responsável por representar a conexão com o banco de dados. Em nosso projeto,
criaremos a pasta Data (localizada em BlogPessoal.Web > Data), e dentro dela
criaremos uma pasta chamada Contexto. Após, adicionaremos uma nova classe,
nomeada como BlogPessoalContexto, o contexto é uma classe que estende
System.Data.Entity.DbContext.
O DbContext dispõe de uma propriedade do tipo DbSet<TEntity> para cada
classe de entidade que deverá ser representada na base de dados. Além disso, é no
contexto que referenciaremos nossas classes de mapeamento da entidade.
Adicionaremos a pasta Mapeamento (localizada em BlogPessoal.Web > Data >
Mapeamento). O próximo passo refere-se ao mapeamento de nossa classe para o
modelo relacional, para isso criaremos uma classe de mapeamento chamada
CategoriaDeArtigoMap conforme demonstra a listagem.
style=sharpc public class CategoriaDeArtigoMap :
EntityTypeConfiguration<CategoriaDeArtigo> public CategoriaDeArtigoMap()
ToTable("categoria_artigo", "dbo");
HasKey(x => x.Id);
Property(x => x.Nome).IsRequired()
.HasMaxLength(150).HasColumnName("nome"); Property(x =>
x.Descricao).IsOptional() .HasMaxLength(300).HasColumnName("descricao");
A classe de mapeamento CategoriaDeArtigoMap deverá ser referenciada em
nosso Contexto BlogPessoalContexto, conforme apresenta listagem a seguir.
style=sharpc public class BlogPessoalContexto : DbContext public
DbSet<CategoriaDeArtigo> CategoriaDeArtigo get; set;
protected override void OnModelCreating(DbModelBuilder modelBuilder)
modelBuilder.Configurations.Add(new CategoriaDeArtigoMap());
base.OnModelCreating(modelBuilder);
Por fim, precisaremos adicionar nossa string de conexão com o banco de dados
no Web.config (localizada: BlogPessoal.Web > Web.config), conforme ilustra a figura
54.
52
Figure 54: String de conexão no web.config.
53
3. Desenvolvendo a apresentação do nosso site (front-
end)
No desenvolvimento de uma aplicação é importante o uso de bibliotecas que
são criadas para realizar tarefas específicas e auxiliar no desenvolvimento. Dessa
forma, aprenderemos novos recursos do framework ASP.NET MVC voltados à
apresentação do site, também apresentaremos um pouco de JavaScript e jQuery, bem
como introduziremos o Bootstrap.
3.1 jQuery
3.2 Bootstrap
55
Figure 56: Página Layout.
Caso você queira construir o Layout do zero, basta acessar a pasta Shared
(localizada em BlogPessoal.Web > Views), clicar com o botão direito do mouse,
navegar até a opção Add > New Item (1), após filtre pela opção Web > MVC (2),
56
selecione a opção MVC 5 Layout Page (Razor) (3). Nomeie este Layout com o nome:
_LayoutBlog.cshtml (4), o arquivo começando com um sublinhado (“_”), fará com que
a visão não seja requisitada. Este processo está demonstrado pela figura 57.
Neste Layout desenvolvido especificamente para o Blog Pessoal, podemos ver o
uso do Razo. A figura 58 apresenta a instrução Razor @RenderBody(), ela renderizará o
conteúdo das Views que utilizam este layout. Outra questão, é o uso do recurso
@RenderSection, ele fornece regiões específicas de código em uma View, para uma
página Layout, como por exemplo, há scripts e folhas de estilo que serão utilizadas em
uma View específica, desse modo não precisamos adicionar os scripts no Layout.
Para obter detalhes maiores sobre @RenderBody(), @RenderSection(), entre
outros recursos do MVC, acesse https://docs.microsoft.com/pt-br/aspnet/web-
pages/overview/ui-layouts-and-themes/3-creating-a-consistent-look.
57
Figure 59: Exemplo de funcionamento do RenderSection.
58
59
4. Outros recursos
Aprenderemos outros recursos para incrementarmos nosso Blog Pessoal.
Usaremos outros templates para o projeto desenvolvido, além de conheceremos mais
recursos do ASP.NET MVC e ferramentas que irão automatizar o desenvolvimento.
60
Table 2: Tipos de Dados do Atributo [DataType].
61
Figure 61: Sintaxe Razor para erros da validações de Model.
Por meio de expressão regular podemos implementar uma validação, para isto
utilizaremos o RegularExpression. Como exemplo, podemos validar se o e-mail
informado é válido, o código a seguir demonstra a implementação desta validação.
style=sharpc public class Login
[RegularExpression(@"^([]+)@([]+)(((̇)2,3)+)", 𝐸𝑟𝑟𝑜𝑟𝑀𝑒𝑠𝑠𝑎𝑔𝑒 = "𝑂𝑒 −
𝑚𝑎𝑖𝑙𝑒𝑟𝑟𝑎𝑑𝑜. ")]𝑝𝑢𝑏𝑙𝑖𝑐𝑠𝑡𝑟𝑖𝑛𝑔𝐸𝑚𝑎𝑖𝑙𝑔𝑒𝑡; 𝑠𝑒𝑡; 𝐸𝑠𝑡𝑒𝑟𝑒𝑐𝑢𝑟𝑠𝑜𝑝𝑒𝑟𝑚𝑖𝑡𝑒𝑣𝑎𝑙𝑖𝑑𝑎𝑟𝑣á𝑟𝑖𝑜𝑠𝑜𝑢𝑡𝑟𝑜𝑠𝑐𝑎𝑚𝑝𝑜𝑠, 𝑐𝑜𝑚𝑜
𝑠𝑒𝑎𝑜𝑛𝑜𝑚𝑒𝑑𝑎𝑐𝑙𝑎𝑠𝑠𝑒𝑑𝑜𝑎𝑡𝑟𝑖𝑏𝑢𝑡𝑜. 𝑂𝑠𝑎𝑡𝑟𝑖𝑏𝑢𝑡𝑜𝑠𝑑𝑒𝑣𝑎𝑙𝑖𝑑𝑎çã𝑜𝑑𝑒𝑣𝑒𝑟ã𝑜𝑠𝑒𝑚𝑝𝑟𝑒𝑎𝑝𝑟𝑒𝑠𝑒𝑛𝑡𝑎𝑟𝑜𝑠𝑢𝑓𝑖𝑥𝑜“𝐴𝑡𝑡𝑟𝑖
𝑠ℎ𝑎𝑟𝑝𝑐𝑝𝑢𝑏𝑙𝑖𝑐𝑐𝑙𝑎𝑠𝑠𝐶𝑢𝑠𝑡𝑜𝑚𝑉𝑎𝑙𝑖𝑑𝑎𝑡𝑖𝑜𝑛𝐶𝑃𝐹𝐴𝑡𝑡𝑟𝑖𝑏𝑢𝑡𝑒: 𝑉𝑎𝑙𝑖𝑑𝑎𝑡𝑖𝑜𝑛𝐴𝑡𝑡𝑟𝑖𝑏𝑢𝑡𝑒, 𝐼𝐶𝑙𝑖𝑒𝑛𝑡𝑉𝑎𝑙𝑖𝑑𝑎𝑡𝑎𝑏𝑙𝑒𝑝𝑢𝑏𝑙𝑖
=
𝑛𝑢𝑙𝑙||𝑠𝑡𝑟𝑖𝑛𝑔. 𝐼𝑠𝑁𝑢𝑙𝑙𝑂𝑟𝐸𝑚𝑝𝑡𝑦(𝑣𝑎𝑙𝑢𝑒. 𝑇𝑜𝑆𝑡𝑟𝑖𝑛𝑔()))𝑟𝑒𝑡𝑢𝑟𝑛𝑡𝑟𝑢𝑒; 𝑟𝑒𝑡𝑢𝑟𝑛𝑈𝑡𝑖𝑙. 𝑉𝑎𝑙𝑖𝑑𝑎𝐶𝑃𝐹(𝑣𝑎𝑙𝑢𝑒. 𝑇𝑜𝑆𝑡𝑟
𝑀𝑜𝑑𝑒𝑙𝐶𝑙𝑖𝑒𝑛𝑡𝑉𝑎𝑙𝑖𝑑𝑎𝑡𝑖𝑜𝑛𝑅𝑢𝑙𝑒 >
𝐺𝑒𝑡𝐶𝑙𝑖𝑒𝑛𝑡𝑉𝑎𝑙𝑖𝑑𝑎𝑡𝑖𝑜𝑛𝑅𝑢𝑙𝑒𝑠(𝑀𝑜𝑑𝑒𝑙𝑀𝑒𝑡𝑎𝑑𝑎𝑡𝑎𝑚𝑒𝑡𝑎𝑑𝑎𝑡𝑎, 𝐶𝑜𝑛𝑡𝑟𝑜𝑙𝑙𝑒𝑟𝐶𝑜𝑛𝑡𝑒𝑥𝑡𝑐𝑜𝑛𝑡𝑒𝑥𝑡)𝑦𝑖𝑒𝑙𝑑𝑟𝑒𝑡𝑢𝑟𝑛𝑛𝑒𝑤
𝑡ℎ𝑖𝑠. 𝐹𝑜𝑟𝑚𝑎𝑡𝐸𝑟𝑟𝑜𝑟𝑀𝑒𝑠𝑠𝑎𝑔𝑒(𝑛𝑢𝑙𝑙), 𝑉𝑎𝑙𝑖𝑑𝑎𝑡𝑖𝑜𝑛𝑇𝑦𝑝𝑒 =
"𝑐𝑢𝑠𝑡𝑜𝑚𝑣𝑎𝑙𝑖𝑑𝑎𝑡𝑖𝑜𝑛𝑐𝑝𝑓"; 𝑂𝑎𝑡𝑟𝑖𝑏𝑢𝑡𝑜𝐶𝑢𝑠𝑡𝑜𝑚𝑉𝑎𝑙𝑖𝑑𝑎𝑡𝑖𝑜𝑛𝐶𝑃𝐹𝐴𝑡𝑡𝑟𝑖𝑏𝑢𝑡𝑒𝑑𝑒𝑣𝑒𝑠𝑒𝑟𝑐ℎ𝑎𝑚𝑎𝑑𝑎𝑒𝑚𝑠𝑢𝑎𝑀𝑜𝑑𝑒𝑙
𝑠ℎ𝑎𝑟𝑝𝑐𝑝𝑢𝑏𝑙𝑖𝑐𝑐𝑙𝑎𝑠𝑠𝑃𝑒𝑠𝑠𝑜𝑎𝐷𝑡𝑜[𝑅𝑒𝑞𝑢𝑖𝑟𝑒𝑑]𝑝𝑢𝑏𝑙𝑖𝑐𝑠𝑡𝑟𝑖𝑛𝑔𝑁𝑜𝑚𝑒𝑔𝑒𝑡; 𝑠𝑒𝑡; [𝑅𝑒𝑞𝑢𝑖𝑟𝑒𝑑][𝑀𝑎𝑥𝐿𝑒𝑛𝑔𝑡ℎ(14)][
2", ErrorMessage = "CPF em formato invalido")] [CustomValidationCPF( ErrorMessage
= "CPF incorreto")] public string CPF get; set;
62
Figure 62: Validação com atributo customizado criado para CPF.
Action Filters executam lógicas de filtragem antes ou depois que uma Action é
chamada. Com ela podemos incluir um filtro que será executado para adicionar um
comportamento aos métodos da Controller. Há alguns tipos de filters específicos para
cada tipo de necessidade, conforme listagem a seguir [18]:
63
Login utilizamos o filtro AllowAnonymous, que permite acesso independente de
qualquer autorização.
Figure 63: Exemplo de filtro para autorização de usuários logados. Fonte: [18].
Para obter detalhes maiores sobre Action Filters, acesse as seguintes URLs:
• http://www.tutorialsteacher.com/mvc/action-filters-in-mvc;
• https://www.codeproject.com/Articles/426766/Custom-Filters-in-MVC-
Authorization-Action-Result;
• https://docs.microsoft.com/pt-br/aspnet/mvc/overview/older-
versions/hands-on-labs/aspnet-mvc-4-custom-action-filters;
•
https://www.infragistics.com/community/blogs/b/dhananjay_kumar/posts/how-to-
create-a-custom-action-filter-in-asp-net-mvc.
64
4.4 Scaffolding
65
Figure 65: Scaffolding para View de criação de Artigo.
66
5. Considerações finais
Neste capítulo, aprendemos como organizar o nosso trabalho. Dividimos o
desenvolvimento no back-end, em que trabalhamos com as Controllers, os Models e o
Entity Framework, para comunicação com o banco de dados, vimos a organização do
nosso projeto Blog Pessoal.
Também iniciamos o desenvolvimento front-end com Bootstrap e jQuery, além
de conhecermos outros recursos do ASP.NET MVC. Percebe-se, o quanto a IDE Visual
Studio nos ajuda no desenvolvimento.
Aprendemos a automatizar as validações de Models por meio de atributos, no
caso do projeto Blog Pessoal, realizamos as validações de Model nas entidades por ser
um projeto simples, porém o recomendado é que seja criada a entidade para
mapeamento do Entity Framework e separadamente seja criada a Model para view
com as validações de atributos.
Conhecemos o Scaffolding de View para ações de CRUD baseado no modelo
escolhido, vimos a criação de todo o código da View automaticamente. Também vimos
o Scaffolding para acréscimo de Controller com todas as ações de CRUD desenvolvidas,
tanto a parte do banck-end e quanto do front-end. É um recurso fantástico, porém é
indicado para projetos simples, na qual não precisamos ter muito controle sobre o
código que está sendo gerado, pois é se trata de um código padrão usando
diretamente o contexto, algo que não muito indicado para projetos mais organizados.
Desse modo, após este módulo estamos aptos a criarmos site simples com
ASP.NET MVC.
67
UNIDADE 3
Organizando um projeto complexo em ASP.NET MVC
Neste capítulo abordaremos a organização de um projeto complexto em
ASP.NET MVC, aprenderemos alguns padrões de projeto, metodologias de trabalho,
como Test Driven Development (TDD), além de outros conceitos muito discutidos
entre a comunidade, como a questão da modelagem de domínios ricos, por meio da
Programação Orientada a Objetos (POO) e Domain Driven Design (DDD).
Todos estes conceitos não serão detalhados a fundo, apenas serão comentados
para que você tenha interesse em conhecê-los e aplicá-los em seus projetos, porém
sempre que possível deixarei links interessantes sobre o assunto para que você não
fique perdido. Nosso objetivo será a organização de um projeto complexo em ASP.NET
MVC explorando ao máximo todos os recursos e ferramentas que sejam úteis para o
seu trabalho.
Antes de iniciarmos um novo projeto mais complexo em ASP.NET MVC, vamos
utilizar o projeto Blog Pessoal para entendermos recursos mais complexos do
framework e atendermos os requisitos solicitados pelo projeto que foram descritos no
capítulo anterior (1.1).
68
apresentar os dados de uma categoria de artigo na View de apresentação do artigo;
69
Conforme já aprendemos, os métodos Html.Partial e Html.RenderPartial não
necessitam de uma Action para seu funcionamento. A implementação do nosso
exemplo se resume na alteração da View de detalhes do Artigo (localizada em:
BlogPessoal.Web > Views > Artigos > Details.cshtml) para realizar a chamada da Partial
View que exibirá os dados da categoria, o arquivo “_CategoriaDetalhes.cshtml”. A
listagem seguinte exemplifica o modo de utilização, lembrando que com o método
Html.Partial podemos armazenar o retorno numa variável, já Html.Partial é o método
“void”. Na última linha, apresentamos uma outra forma de chamar a Partial View por
meio do caminho relativo.
• https://www.c-sharpcorner.com/UploadFile/4b0136/introducing-Asp-Net-
signalr-in-mvc-5/;
• https://docs.microsoft.com/pt-br/aspnet/signalr/overview/getting-
started/tutorial-getting-started-with-signalr-and-mvc;
• http://www.eduardopires.net.br/2013/04/aspnet-signalr-introducao-e-
utilizacao/;
• http://www.macoratti.net/13/03/net_sign1.htm;
• http://netcoders.com.br/signalr-e-mvc-pedidos-para-a-cozinha-em-tempo-
real/.
9 https://www.asp.net/signalr
70
2. Organização do projeto
Neste seção iremos detalhar a organização de um projeto complexo em
ASP.NET MVC. O que iremos aprender são alguns padrões de projetos, conceitos e
técnicas de desenvolvimento.
Quando falamos de projeto de desenvolvimento, não há uma regra
estabelecida e que deve ser seguida em todos os projetos que você for desenvolver.
Será ensinado um modelo para aplicações maiores, porém é você que deve analisar a
complexidade de seus projetos e encontrar a melhor maneira de organizar seu
desenvolvimento.
Nosso projeto será organizado em três camadas, são elas:
http://www.eduardopires.net.br/2016/08/ddd-nao-e-arquitetura-em-
camadas/
Não entraremos em maiores detalhes sobre DDD pois é um assunto que tem
muito material para estudarmos, ficaremos apenas com a iniciação por meio do
projeto Loja Virtual. Faço um pedido para que você possa aprofundar neste e demais
assuntos que serão iniciados neste livro.
71
2.1.1 Testes
Por meio da IDE Visual Studio e com o projeto Loja Virtual de teste, vamos criar
testes de unidade para as regras desenvolvidas. Esta ferramenta permite automatizar
nossos testes, pois após finalizar a criação de um novo teste podemos executá-lo
quantas vezes quisermos.
Nesse contexto, precisamos conhecer o Test Driven Development (TDD), ou
Desenvolvimento Guiado pelos Testes, na qual prega que o desenvolvedor deve
começar a implementação pelo teste e, deve o tempo todo, fazer de tudo para que seu
código fique simples e com qualidade [1].
O importante que devemos saber sobre teste, é que o custo de correção de
falhas/bugs pode ser aumentado em até 100x quando corrigidos nas fases finais de
desenvolvimento, ao compararmos com o custo de corrigir os mesmos problemas em
fases iniciais do projeto.
O TDD torna o processo mais confiável, além de reduzir custos, pois
desenvolvemos e já sabemos o erro, pois como os testes são criados antes do processo
de desenvolvimento, conseguimos testar constantemente. Outro ponto é que se os
testes foram criados, isso quer dizer que foram entendidas as regras de negócio
durante a fase de desenvolvimento dos testes unitários [22].
O ciclo do TDD é simples, primeiramente criamos um teste, depois fazemos a
codificação para passar no teste implementado, por fim, refatoramos nosso código. A
figura 66 apresenta o ciclo descrito.
72
Figure 66: Ciclo do TDD. Fonte: [22].
Por estes motivos, muitas empresas e desenvolvedores optam pelo uso do TDD
durante o processo de desenvolvimento. O assunto TDD está bastante comentado pela
comunidade, dessa forma, recomenda-se o estudo deste método de desenvolvimento,
já que neste livro apenas iniciaremos o estudo dele voltado ao nosso projeto.
Para começarmos a desenvolver nossos primeiros testes, pode ser facilitada
por meio de algumas bibliotecas que adicionaremos ao nosso projeto. Existem diversas
ferramentas que possibilitam esta prática, vamos a algumas:
10 https://www.nuget.org/packages/NBuilder/
11 https://www.nuget.org/packages/Faker.Net/
12 https://www.nuget.org/packages/Bogus/
13 https://www.nuget.org/packages/moq/
14 https://www.nuget.org/packages/xunit
73
Implementaremos um código fonte para exemplificar o uso de cada ferramenta
listada anteriormente e também o processo de desenvolvimento seguindo o TDD.
Porém antes de iniciarmos, vamos aprender o padrão AAA (Arrange, Act, Assert) para
criação dos nossos testes, cada termo tem o seguinte significado:
Há vários tipos de Asserts que podem ser utilizados para verificar o resultado
dos nossos testes, leia a documentação encontrada no site da MSDN:
https://msdn.microsoft.com/pt-br/library/ms182530.aspx.
Vamos para o nosso exemplo, acesse o projeto de teste, caso você ainda não
tenha criado, basta adicionar um projeto do tipo “Unit Test Project (.NET Framework)”
e não esquecer de nomear o projeto da seguinte maneira, por exemplo,
LojaVirtual.Tests, por padrão utilize o nome da solução acrescido do “.Tests”.
Agora, iremos adicionar uma classe de teste, pelo Visual Studio acessaremos a
opção para adicionar novos itens, encontre a categoria “Test”, e escolha a opção “Unit
Test”, atribua o nome do domínio que será testado acrescentado do termo “Test”, por
exemplo CalculadoraTest.
Em nosso exemplo de teste, simularemos o trabalho de uma Calculadora.
Seguindo o TDD, vamos implementar nosso teste que verificará a soma de dois valores.
A listagem a seguir apresenta o teste implementado, veja que é importante nomear
claramente o nosso método, como forma didática apresentamos o teste juntamente
com o padrão AAA, porém nos outros testes organizaremos este padrão pulando
linhas, sem comentários os AAA.
74
Por fim, nossa implementação ficará conforme as seguintes listagens.
Este assunto pode ser muito mais explorado, e é importante que você
aprofunde o conhecimento em testes, ele tem sido o diferencial entre os
desenvolvedores. A prática e estudos levam a aprendizagem de como testar de
maneira efetiva e o que realmente precisa ser testado.
Os princípios SOLID são a base para vários padrões de projetos (GoF). São
considerados uma boa prática de programação orientada a objetos que visam diminuir
o acoplamento entre classes e separar responsabilidades como forma de melhorar o
código da aplicação desenvolvida, além de contribuir para manutenção do software.
SOLID é um acrônimo que representa os 5 princípios da programação orientada
a objetos, que são:
75
desenvolvidos, é importante que estes princípios estejam enraizados em nossa
codificação.
Recomenda-se o estudo e a prática dos princípios SOLID, pois estes
conhecimentos te ajudarão a ser um profissional mais qualificado. Deixo alguns links
para que você possa iniciar seus estudos e depois aprofundá-los, o bom de aprender
padrões de projeto, princípios SOLID, é que eles são aplicados independente da
linguagem, por isso é importante a compreensão do que é proposto para que você
possa aplicar em suas necessidades.
76
Figure 67: Exemplo de código muito acoplado.
1. Unity: https://www.nuget.org/packages/Unity/;
2. Unity.Mvc: https://www.nuget.org/packages/Unity.Mvc/.
Após a instalação dos pacotes do Unity, vejamos que duas classes são
adicionadas em nosso projeto. A classe UnityMvcActivator configura a injeção de
dependência em nosso projeto, esta classe precisa ser inicializada por meio do método
Start(), faremos esta inicialização na classe Global.asax, por meio do método
Application_Start() adicionaremos o código: UnityMvcActivator.Start();.
A outra classe adicionada, é a UnityConfig, ela é responsável por configurar o
objetos que serão controlados pelo Unity, ou seja, os objetos que serão injetados em
nossas classes. Desse modo, não precisaremos tomar cuidado para instanciar o
Contexto do EF, carregar o repositório e todo o resto, o próprio Unity ficará
responsável por gerenciar nossos objetos.
A listagem a seguir apresenta o modo de referenciar classes para injeção.
77
Figure 68: Exemplo de código utilizando repositório de Pessoa por meio da injeção de
dependência via configuração do Unity.
• http://www.macoratti.net/11/07/ioc_di1.htm;
• https://www.devmedia.com.br/design-patterns-injecao-de-dependencia-
com-csharp/23671;
• https://martinfowler.com/articles/injection.html.
A camada de acesso a dados, também chamada por Data Access Layer (DAL), é
responsável pela persistência dos dados, ela permite separar regras de negócio das
regras de acesso a banco de dados. Em nossa aplicação, ficarão organizadas nesta
camada todas as funcionalidades de banco de dados, como toda a estrutura utilizada
pelo Entity Framework, ou seja, classes de mapeamento da entidade, contexto e
atualizações do banco, além da classe para obter as conexões ao banco ou para
executar comandos SQL, e repositórios de dados.
No Entity Framework, há três métodos de trabalho que valem a pena ser
apresentadas:
• Model First16: modelamos nossa base de dados de forma visual por meio
dos recursos da própria IDE Visual Studio, utilizamos o arquivo .EDMX integrado;
15 https://docs.microsoft.com/pt-br/aspnet/mvc/overview/getting-started/database-first-development/setting-up-database
16 https://www.c-sharpcorner.com/UploadFile/4b0136/model-first-approach-in-Asp-Net-mvc-5/
17 https://docs.microsoft.com/pt-br/aspnet/mvc/overview/getting-started/getting-started-with-ef-using-mvc/creating-an-entity-
78
classes de domínio, e o contexto, depois criamos nosso banco por meio de Migrations.
Veja algumas dicas para você escolher qual o melhor modelo de trabalho para
suas necessidades, acesse:
http://www.entityframeworktutorial.net/choosing-development-approach-
with-entity-framework.aspx.
• http://www.entityframeworktutorial.net/code-first/dataannotation-in-
code-first.aspx
• http://www.entityframeworktutorial.net/code-first/fluent-api-in-code-
first.aspx
2.2.1 Migrations
framework-data-model-for-an-asp-net-mvc-application
18 https://docs.microsoft.com/pt-br/ef/ef6/modeling/code-first/data-annotations
19 https://docs.microsoft.com/pt-br/ef/ef6/modeling/code-first/fluent/types-and-properties
79
a aplicação que estiver configurada com a conexão do banco de dados, que no caso do
nosso exemplo será o projeto web “LojaVirtual.Web” (acesse as propriedades e clique
em “Set as StartUp Project” (1)), e no “Package Manager Console” lembre-se de setar
como “Default Project” (2) o projeto responsável por acesso ao banco de dados, que
no caso será a biblioteca “LojaVirtual.DAL”, a figura 69 apresenta este passo inicial
para usarmos a técnica de Migrations.
81
style=sharpc public interface IClienteRepositorio : IRepositorioBase<Cliente>
void AuditarAcesso();
style=sharpc public class ClienteRepositorio : RepositorioBase<Cliente>,
IClienteRepositorio public void AuditarAcesso() Debug.WriteLine("Algo de Cliente");
2.3.1 Componentização
Como já vimos o ASP.NET MVC possibilita o trabalho com Partial Views, este
recurso é muito interessante, conforme já vimos, porém há um modelo de trabalho
em que este recurso pode ser potencializado.
A componentização de software pode ser descrita como uma unidade de
software que pode ser unida a outras unidades de software para formar um sistema de
maior tamanho [21]. Nesse contexto, os componentes são úteis pela capacidade de
sua reutilização em outras páginas/aplicações.
Assim, recomenda-se que quando formos desenvolver nossas telas, caso exista
a possibilidade, devemos dividi-lá em várias Partial Views que sejam de acordo com a
separação de responsabilidades, desse modo, podemos ter um baixo acoplamento e
aumentar o uso de componentes já desenvolvidos.
Um exemplo prático que pode ser visualizado no projeto, seria a criação de
uma Partial View para visualização dos dados do endereço. Esta Partial View poderá
ser utilizada no cadastro de Clientes, para exibição do endereços dele, e também
poderá ser reutilizada no fluxo de fechamento do pedido de compra da nossa loja,
apresentando as informações do endereço de entrega.
• https://docs.microsoft.com/en-
us/dotnet/api/system.web.helpers.webgrid?view=aspnet-webpages-3.2;
• https://www.aspsnippets.com/Articles/WebGrid-Step-By-Step-Tutorial-
with-example-in-ASPNet-MVC.aspx.
83
WebGrid, porém vimos que a paginação acontece apenas na View para apresentação
ao usuário. Dessa forma, não é indicado para uma tabela que tenha muitos registros,
pois para estas tabelas maiores, devemos paginar os registros na Controller e retornar
apenas os itens de uma determinada página.
Neste caso, podemos utilizar a biblioteca PagedList, disponível via Nuget pelo
link https://www.nuget.org/packages/PagedList/. Para demostrar este recurso,
utilizaremos o projeto BlogPessoal, criaremos uma nova listagem de categorias que
será desenvolvida por meio do PagedList.
Em nosso Controller CategoriasDeArtigoController, criaremos uma nova Action
para listagem chamada de IndexPagedList e que aceitará como parâmetro opcional a
página desejada para apresentação de registros, confira a implementação desta Action
a seguir.
84
"espaco-botao" )
@Html.ActionLink("< Anterior", "IndexPagedList", new pagina =
Model.PageNumber - 1 , new @class = "espaco-botao" )
@if (Model.HasNextPage) @Html.ActionLink("Proximo >", "IndexPagedList",
new pagina = Model.PageNumber + 1 , new @class = "espaco-botao" )
@Html.ActionLink("Ultimo >>", "IndexPagedList", new pagina =
Model.PageCount , new @class = "espaco-botao" ) </div>
<fieldset> <p> Registros encontrados: @Model.TotalItemCount </p> <p>
Pagina @(Model.PageCount < Model.PageNumber ? 0 : Model.PageNumber) de
@Model.PageCount </p> </fieldset>
85
Filtros em cascata é um requisito comum em aplicações, na qual refere-se a
capacidade de filtrarmos os registros apresentados em um componente DropDownList
com base no item selecionado pelo usuário em outro componente.
Por exemplo, no projeto Loja Virtual, o cadastro de endereço terá o seguinte
comportamento: quando o usuário selecionar a Unidade Federativa (UF) desejada por
meio do DropDownList, a aplicação deverá carregar os municípios associados àquela
UF selecionada em outro DropDownList.
Vamos testar este recurso, as alterações em nosso projeto serão bem simples,
precisaremos de algumas linhas de código em alguns Controllers e Views, além de um
pouco de jQuery e JSON.
Primeiramente, aprenderemos como usar o atributo UIHint em aplicações
ASP.NET MVC. Ele especifica o template que o Dynamic Data vai usar para exibir um
campo de dados. Quando o atribuímos em uma propriedade da Model e ao usar o
EditorFor do Razor em nossas Views, o framework ASP.NET MVC vai procurar o modelo
especificado que definimos no atributo UIHint. A listagem a seguir demonstra o uso
deste atributo em uma Model.
• EditorFor:
- /Views/Shared/EditorTemplates
- /Views/Controller_Name/EditorTemplates
• DisplayFor:
- /Views/Shared/DisplayTemplates
- /Views/Controller_Name/DisplayTemplates
86
@ var municipios = ViewBag.Municipios as List<MunicipioDto>; var
selectMunicipio = new SelectList(municipios, "Id", "Nome");
@Html.DropDownListFor(model => model, selectMunicipio, "[Selecione]", new
@class = "form-control" )
style=sharpc (𝑓𝑢𝑛𝑐𝑡𝑖𝑜𝑛()(’#UFId’).change(function ()
. 𝑎𝑗𝑎𝑥(𝑚𝑒𝑡ℎ𝑜𝑑: ′𝑃𝑂𝑆𝑇′, 𝑢𝑟𝑙: ′/𝑃𝑒𝑠𝑠𝑜𝑎𝑠/𝑂𝑏𝑡𝑒𝑟𝑀𝑢𝑛𝑖𝑐𝑖𝑝𝑖𝑜𝑠/
′, 𝑑𝑎𝑡𝑎𝑇𝑦𝑝𝑒: ′𝑗𝑠𝑜𝑛′, 𝑑𝑎𝑡𝑎: 𝑢𝑓𝐼𝑑:(this).val() , cache: false, async: true, success: function
(data) (′#𝑀𝑢𝑛𝑖𝑐𝑖𝑝𝑖𝑜𝐼𝑑′). ℎ𝑡𝑚𝑙(′′);(’#MunicipioId’).append((′ < 𝑜𝑝𝑡𝑖𝑜𝑛 ><
/𝑜𝑝𝑡𝑖𝑜𝑛 > ′). 𝑣𝑎𝑙(𝑛𝑢𝑙𝑙). ℎ𝑡𝑚𝑙("[𝑆𝑒𝑙𝑒𝑐𝑖𝑜𝑛𝑒]"));.each(data, function (index)
(′#𝑀𝑢𝑛𝑖𝑐𝑖𝑝𝑖𝑜𝐼𝑑′). 𝑎𝑝𝑝𝑒𝑛𝑑((’<option></option>’)
.val(data[index].Id).html(data[index].Nome)); ); ); );
87
Figure 72: Apresentação do DropDown Cascade.
Após estas alterações, vimos que, por exemplo, ao tentar acessar a rota
Artigos/Index do ArtigosController que possui o atributo [Authorize], recebemos como
resposta a tela de Login, conforme apresenta a figura 73. Repare que a rota
Artigos/Index está disponível por meio da query string returnUrl.
Após realizar a autenticação corretamente por meio do e-mail e senha de um
autor disponível no banco de dados do projeto Blog Pessoal, a página para listagem de
89
Artigos é carregada. No menu, apresentamos o e-mail do autor logado no sistema e
um botão para sair da aplicação. A Action responsável por sair do sistema segue o
trecho de código a seguir, praticamente precisaremos chamar o comando
FormsAuthentication.SignOut().
style=sharpc public ActionResult Sair() FormsAuthentication.SignOut(); return
RedirectToAction("Index");
2.3.6 Roles
90
Primeiramente, no projeto Blog Pessoal, alteraremos nosso método de login
em AcessoController para informarmos os respectivos roles do usuário logado, confira
o trecho de código a seguir que demonstra nossa alteração.
Por fim, no projeto Blog Pessoal, permitiremos que apenas autores que
possuem a flag administrador ativa poderão acessar a gestão de Autores, para realizar
esta configuração precisaremos acrescentar os Roles solicitados pelo atributo
Authorize em AutoresController, o comando que deve ser chamado é:
[Authorize(Roles = "Admin")], acompanhe o trecho de código a seguir.
Desse modo, apenas usuários com Roles de Admin poderão acessar as Actions
do Controller de Autores. Realize estas alterações e teste sua implementação,
autentique usuário admin e depois tente acessar com um autor que não possua a flag
administrador ativa.
O ASP.NET Identity é um sistema de associação para a construção de aplicações
web, para smartphones, aplicações híbridas, etc., usando as identidades sociais para
autenticação e autorização. Desse modo, poderemos utilizar o Windows Live (Hotmail,
por exemplo), Gmail, Facebook e Twitter para autenticação antes que o usuário
comece a usar nossa aplicação web. Recomendo a leitura do seguinte artigo para
91
aprofundamento sobre este assunto:
http://www.macoratti.net/15/10/mvc_roles1.htm
Quando formos trabalhar com esta tecnologia, precisaremos referenciar as
bibliotecas:
• Microsoft.AspNet.Identity;
• Microsoft.AspNet.Identity.Owin;
• Microsoft.AspNet.Identity.EntityFramework;
• Microsoft.Owin.Host.SystemWeb.
2.4 ValidateAntiForgeryToken
Nossa aplicação web pode sofrer com ataques de solicitação intersite forjada,
ou também conhecido como Cross Site Request Forgery (CSRF). O CSRF é um problema
de segurança relacionado com a possibilidade de que outras aplicações possam
realizar requisições em nosso site, dessa forma, ficamos expostos a problemas como
ataque de um clique (one-click attack) ou sequestro de sessão (session riding).
Com a finalidade de evitar este problema, utilizaremos o
Html.AntiForgeryToken() em nossos formulários. Ele protege nossa aplicação da falha
relacionada ao CSRF, pois este recurso gera um cookie com os códigos de AntiForeky e
insere o código mais recente como campo oculto na View.
As alterações em nosso código são muito simples, basta adicionarmos o
seguinte atributo [ValidateAntiForgeryToken] na Action que receberá uma requisição
HTTP por meio do método POST. O trecho de código a seguir demonstra a
implementação deste recurso para realizar o login no projeto Blog Pessoal.
20 http://www.eduardopires.net.br/2014/08/asp-net-identity-tutorial-completo/
92
"validator", role = "form", defaultbutton = "entrar" )) @Html.AntiForgeryToken()
@Html.ValidationSummary(true) <div class="form-group"> <div class="input-group">
...
93
Web.config da aplicação web, conforme listagem a seguir.
style=sharpc ... <system.webServer> <rewrite> <rules> <rule name="Redirect
to https" stopProcessing="true"> <match url="(.*)" /> <conditions> <add
input="HTTPS" pattern="off" ignoreCase="true" /> </conditions> <action
type="Redirect" url="https://HTTP_HOSTREQUEST_URI" redirectType="Permanent"
appendQueryString="false" /> </rule> ...
Por meio desta simples configuração todas as requisições que não estiverem
em HTTPS são redirecionadas, lembrando que esta configuração depende de um
recurso para URL Rewrite instalado no servidor da aplicação e também a aquisição de
um certificado SSL. Deixarei alguns links listados a seguir para aprofundamento do
assunto:
• https://configr.com/blog/a-importancia-de-se-ter-um-site-com-https-ssl/;
• https://www.pedrodias.net/webmaster/migrar-para-https.
94
tenham acesso a informações do servidor.
Continuando neste ponto de não exibir informações, é imprescindível que seja
configurado o tratamento de erro, pois devemos evitar que página de erro do servidor
seja apresentada ao usuário, além de que aquelas informações podem expor certos
dados que na mão de pessoas mal intencionadas, sejam prejudiciais a nossa aplicação.
95
3. Desempenho da aplicação
Atualmente, nós queremos acessar as informações o mais rápido possível, por
vezes não temos muita paciência para esperar o carregamento de uma página que está
demorando muito, salvo se for algo muito específico e exclusivo para gente.
Neste cenário, precisamos criar aplicações que tenham desempenho alto e que
consumam o menor recurso possível, pois vejamos que o acesso de aplicação via
mobile está aumentando cada vez mais, desse modo, além de desenvolvermos um site
que seja responsivo, ele precisa apresentar informações de maneira rápida.
Assim, as próximas seções apresentarão técnicas, tecnologias e ferramentas
que nos ajudarão a melhorar o desempenho de nossas aplicações.
21 https://www.dotnetperls.com/application-beginrequest
96
Figure 74: Detalhes da requisição compactada com compressão GZIP.
97
Figure 75: Tamanho da requisição sem compressão.
99
A figura 77 demonstra uma requisição realizada sem filtro de remoção de
espaços, vejamos que o tamanho total retornado foi de 4.7 KB. Já, a figura 78 que
apresenta uma requisição com filtro de remoção de espaços configurado, retornou o
tamanho total de 3 KB, comprimindo o tamanho da resposta em aproximadamente
quase 25%.
Uma dica especificamente sobre este filtro, quando você for aplicá-lo verifique
se suas páginas funcionarão corretamente, pois já vi alguns caso que a aplicação de
atributo inviabilizou a ação de plugin que era inicializado e também acarretou um
problema num componente desenvolvido. Fora este ponto de atenção, recomendo
que você sempre analise seu cenário e identifique o uso deste ou qualquer outro filtro,
até mesmo a combinação de vários atributos para que nossa aplicação tenha um
desempenho melhorado.
Qualquer filtro que formos utilizar é essencial que nós os testemos, a fim de
verificar se o funcionamento da tela continua correto.
Antes de iniciarmos, sabemos que há anos toda a parte de design dos sites
ocorre por meio de arquivos CSS. Não basta ter um HTML perfeito, com tudo o que
esta versão nos oferece, é fundamental um bom CSS para fazer o show a parte. Então,
é comum num projeto de tamanho médio ter diversos arquivos CSS, a fim de
customizar as páginas do site. Outro fator que todo desenvolvedor WEB deve saber, é
que o uso de JavaScript, é cada vez mais usado. Aliás, é praticamente impossível hoje
em dia uma aplicação WEB não usar JavaScript. Isto tudo porque o processamento do
código será realizado no lado do cliente [10].
Neste sentido, imaginemos a quantidade de bytes trafegados entre o servidor e
o cliente a cada solicitação? Será que há como diminuir esta quantidade, ou melhor
ainda, colocar parte dos dados no cache do servidor? É neste cenário que iremos
aplicar o recurso de empacotamento e minimização disponível no ASP.NET.
Primeiramente realizaremos a configuração do Bundle no projeto Blog Pessoal,
criaremos a classe BundleConfig dentro na pasta App_Start, implementaremos um
método estático chamado RegisterBundles que recebe como parâmetro uma coleção
de Bundles (BundleCollection), confira listagem a seguir. Importante lembrar que esta
classe faz referência ao namespace System.Web.Optimization, encontrada via Nuget:
https://www.nuget.org/packages/Microsoft.AspNet.Web.Optimization/
100
Note que a cada linha é adicionado um elemento à coleção (bundle.Add) onde
você pode referenciar um ScriptBundle ou um StyleBundle.
Nesta notação é preciso informar o nome virtual (" /bundles/jquery") que será
criado em tempo de execução numa pasta chamada bundles abaixo do diretório raiz,
seguido do método Include, onde forneceremos toda a lista de arquivos separados por
vírgula. Esta estrutura vale tanto para script quanto style.
Outra notação a ser aprendida é o version, que significa qualquer versão. Por
exemplo, em “ /Scripts/jquery-version.js” significa que qualquer arquivo chamado
jquery-1.10.2.js, jquery-1.10.2.intellisense.js ou jquery-1.10.2.min.js serão adicionados
ao mesmo.
Precisaremos referenciar a classe BundleConfig no arquivo Global.asax.cs,
iremos invocá-lo dentro do método chamado Application_Start que é executado toda
vez que a aplicação é iniciada. Confira listagem a seguir que há uma chamada para a
classe BundleConfig.RegisterBundles passando a lista de BundleTables.Bundles.
101
Figure 79: Utilizando Bundle no arquivo _Layout.cshtml.
102
Figure 81: Arquivo jQuery obtido pela requisição da página inicial do Blog Pessoal.
103
Figure 82: Requisições da página inicial do projeto Blog Pessoal com otimização
ativada.
Figure 83: Arquivo jQuery Minified obtido pela requisição da página inicial do Blog
Pessoal.
3.4 Cache
Na View Index (localizado em: View > Home) adicionaremos uma tag <div> que
apresentará o horário corrente da requisição, com esta implementação conseguiremos
ver o recurso de cache ação, pois depois da primeira vez que a View for carregada e
nós solicitarmos novamente esta View, a requisição não será enviada para o servidor
novamente caso seja feita entre os 10 segundos definidos no OutputCache como
duração do cache.
Ainda no projeto Blog Pessoal, implementaremos cache na View responsável
por exibir detalhes dos artigos, desse modo deixaremos nosso site mais rápido e
preparado caso nossos artigos sejam acessados por muitas pessoas, evitando ao
máximo que nossa aplicação fica off-line, e se caso fique pelo menos o conteúdo
carregado fique disponível aos usuários durante um período.
Primeiramente, configuraremos o [OutputCache(Duration = 20, VaryByParam =
"id")] na Action Details do ArtigosController. Veja que o parâmetro “VaryByParam”
está com o valor “id”, ou seja, determina que serão armazenadas diferentes entradas
em cache para cada combinação de valores constantes nos objetos
Request.QueryString e Request.Form. Desse modo, ao requisitarmos o endereço
http://localhost:xxxx/Artigos/Details/1 ele ficará armazenador em cache durante 20
segundos, mesmo que nós acessemos outra página de detalhes do artigo e voltarmos
para a primeira View de detalhe aberta, ela continuará em cache até que se passe os
20 segundos definidos.
Vimos que o cache está ação quando exploramos detalhes das nossas
requisições e vemos no cabeçalho de resposta o atributo Cache-Control: public, max-
age=20, conforme exemplifica a figura 84.
105
Figure 84: Detalhes da requisição com controle de cache.
• https://www.tutorialspoint.com/asp.net_mvc/asp.net_mvc_caching.htm;
• https://www.devmedia.com.br/efetuando-o-cache-de-views-no-asp-net-
mvc/27628;
• https://docs.microsoft.com/pt-br/aspnet/mvc/overview/older-versions-
1/controllers-and-routing/improving-performance-with-output-caching-cs.
3.5 Cookie
106
usuário, como por exemplo, no projeto Loja Virtual podemos armazenar os itens
adicionados ao “carrinho de compra” em um cookie, desse modo, caso o usuário não
finalize a compra, os itens adicionados continuarão no carrinho quando voltar ao site,
ou posteriormente enviaremos e-mail referente a aqueles produtos. Ele possui
algumas limitações de tamanho, quantidade por browser, entre outras.
Implementaremos um simples exemplo do uso de Cookie no projeto Blog
Pessoal, salvaremos o e-mail utilizado ao logar no site para que na próxima vez que o
autor acessar nosso site, o e-mail dele já estará preenchido. Para salvar o e-mail no
cookie implementaremos o trecho de código a seguir em AcessoController (localizado
em: BlogPessoal.Web > Controllers > AcessoController).
• https://msdn.microsoft.com/pt-br/library/ms178194(v=vs.100).aspx;
• https://www.devmedia.com.br/gravacao-leitura-e-remocao-de-cookies-no-
asp-net/32835.
107
3.7 Desempenho em consultas
108
Figure 85: Habilitar Log do EF.
Por fim, a figura 86 apresenta Log dos comandos gerados pelo EF durante
execução em debug da aplicação Loja Virtual. Na imagem foram executados comandos
realizados à manutenção do domínio Departamento.
109
Figure 86: Log dos comandos gerados pelo EF.
110
Figure 87: Ferramenta Profiler SQL Server.
• https://www.devmedia.com.br/sql-server-query-analise-do-plano-de-
execucao/30024;
• https://imasters.com.br/banco-de-dados/5-coisas-que-voce-deve-saber-
sobre-o-plano-de-execucao-das-suas-queries.
3.7.2 LINQPad
111
Figure 88: Ferramenta LINQPAD.
3.7.3 Dapper
Vimos que os ORMs são úteis em grande número de situações, porém eles
podem apresentar limitações em cenários mais específicos, como por exemplo,
consultas que envolvem tabelas com muitos registros são demoradas, pois os
comandos SQL gerados por meio de uma solução ORM nem sempre serão executadas
da forma mais performática possível.
Uma solução possível para este cenário, seria o uso de recursos básicos do
ADO.NET, de modo a utilizarmos instruções SQL escritas de forma a se beneficiarmos
de índices que otimizem o processamento, porém este recurso pode não ser tão
produtivo em termos de desenvolvimento.
É neste cenário que utilizaremos o micro-ORM Dapper, que não possui as
funcionalidades igual de um ORM, mas disponibiliza Extension Methods que
simplificam o trabalho com os objetos de conexão do ADO.NET.
Para utilizá-lo em nossos projetos, precisaremos instalar o Dapper via Nuget.
Como ele trabalha com métodos de extensão sobre a conexão, precisaremos criá-la
para começar a utilizá-lo.
É interessante que para relatórios, gráficos e consultas
complexas/performáticas utilizarmos o Dapper.
Recomendo o acesso à página oficial do projeto Dapper, acesse:
https://github.com/StackExchange/Dapper.
Também recomendo conhecer o Dapper.Contrib que é uma extensão do
Dapper que facilita a implementação do CRUD (inclusão, alteração, exclusão e leitura
112
de registros).
Uma boa prática é evitar escrever consultas direto no código do projeto, prefira
chamar Views do banco de dados.
113
4. Considerações finais
Criptografia é uma alinhada que você deve ter durante o desenvolvimento.
Pode ser aplicada em vários lugares em nossa aplicação, por exemplo, criptografar a
string de conexão do banco no Web.config e as informações sensíveis do usuário.
Falando de criptografia e Web.config, vamos lembrar de configurar o certificado SSL
em nossa aplicação, vimos os benefícios desta tecnologia, sabemos que só ela não irá
garantir toda a segurança em nossa aplicação, mas com certeza já será de grande valia
neste assunto, além de ajudar a indexação do nosso site pelos buscadores de site.
Vale destacar que páginas lentas não contribuem com a indexação do site pelos
tradicionais buscadores do mercado. Desse modo, devemos sempre buscar o bom
desempenho de nossas aplicações, precisamos utilizar, sempre que possível e quando
viável, todas as técnicas que aprendemos neste capítulo, como a compactação da
requisição, uso de cache, cookie, entre outras tecnologias.
Jamais esqueça de desenvolver sua aplicação com o máximo de segurança
possível, garanta a proteção de quem está acessando sua aplicação. Além da
segurança, se preocupe com o desempenho de seu projeto, sabemos que a maioria
dos usuários esperam pouco tempo para que o site seja carregado, caso ele demore
muito, perderemos usuários.
114
UNIDADE 4
Publicando nossos projetos
Neste capítulo, aprenderemos como disponibilizar nossa aplicação para os
clientes. Conheceremos as ferramentas utilizadas para publicação na nuvem por meio
do Azure e manualmente pelo Internet Information Services (IIS).
Serão apresentadas técnicas de indexação para que sua aplicação seja bem
ranqueada pelos diversos sites de busca.
Por fim, apresentaremos algumas dicas, boas práticas e assuntos que nós
devemos colocar no nosso radar de conhecimento para sermos desenvolvedores
melhores.
115
Para verificarmos se ocorreu tudo certo com nossa instalação, basta
acessarmos o navegador com a seguinte url: http://localhost/, deve ser carregado a
tela padrão do IIS, conforme apresenta a figura 90.
dos componentes mais recentes da Microsoft Web Platform, incluindo o IIS, o SQL
Server Express, o .NET Framework e o Visual Studio. Também facilita a instalação e a
execução dos aplicativos da Web gratuitos mais populares para blogs, gerenciamento
de conteúdo e muito mais com a galeria de aplicativos da Web incorporada do
Windows. A figura 91 apresenta a tela inicial do Web Plataform Installer.
22 https://www.microsoft.com/web/downloads/platform.aspx
116
Figure 91: Apresentação Web Plataform Installer.
117
Figure 93: Publicação com sucesso do projeto BlogPessoal.Web.
Por fim, iremos adicionar nosso site no Gerenciador do IIS. Na a opção “Sites”
clique em “Adicionar Sites...”, a tela representada pela figura 95 deverá ser
apresentada. O nome do nosso site será “BlogPessoal”, depois selecionaremos o Pool
de Aplicativos criado na etapa anterior, informaremos o caminho onde publicamos os
arquivos do site pelo Visual Studio, e por fim adicionaremos uma porta que nossa
aplicação será iniciada, muito cuidado para não informar uma porta que já está sendo
utilizada para qualquer outro serviço.
118
Por fim, basta acessarmos localhost na porta informada, o site Blog Pessoal
deve ser carregado, conforme apresentada a figura 96. No exemplo apresentado, o
projeto utiliza uma conexão com banco de dados do SQL no Azure, você pode utilizar o
banco de dados configurado na seu computador, porém precisará configurá-lo, caso
tenha interesse pesquise sobre acesso remoto do SQL Server 23.
23 https://www.sqlfromhell.com/habilitando-a-conexao-remota-no-sql-server/
24 https://www.iis.net/downloads/microsoft/web-deploy
119
Figure 98: Configurando perfil de publicação para Web Deploy.
120
2. Microsoft Azure
Iniciaremos um estudo básico sobre o Microsoft Azure 25, que é uma
plataforma para a implementação de computação em nuvem (cloud computing) que
oferece um conjunto específico de serviços para desenvolvedores e engloba desde
websites até active directory, passando por banco de dados SQL, machine learning
entre outros recursos.
O Microsoft Azure pode ser usado tanto como IaaS (Infrastructure-as-a-Service)
quando como PaaS (Platform-as-a-Service), é flexível (qualquer linguagem de
programação e qualquer sistema operacional) além da possibilidade de escalar
facilmente.
Há muitas vantagens ao adotar o Azure, como a questão de você não se
preocupar diretamente com a infraestrutura, backup, segurança, redundância, além de
outros importantes assuntos. Com esta tecnologia podemos tornar nossa aplicação
escalável por meio de poucos cliques, imagina realizar a mesma ação em uma
infraestrutura local? Daria bem mais trabalho.
Você pode estar se perguntando, será que eu como desenvolvedor devo me
preocupar com infraestrutura? Será que preciso entender destes assuntos também? A
respostas simplesmente é sim, nós como desenvolvedores devemos entender de
infraestrutura também, ainda mais se nosso objetivo é sermos cada dia mais
desenvolvedores melhores. Precisamos conhecer sobre a infraestrutura que nossa
aplicação será executada, nesse sentido, conhecer a estrutura do Microsoft Azure nos
ajuda a rodarmos nossos projetos com maior desempenho possível e utilizando menos
recurso, afinal quando falamos de cloud computing seremos cobrados por diferentes
critérios, como horas de uso, processamento, tráfego entre outros.
Os principais serviços do Microsoft Azure que poderemos utilizar em nossas
aplicações são:
25 https://azure.microsoft.com/pt-br/
121
O Azure permite a criação de uma conta gratuita que oferece 12 meses de
serviços gratuitos, caso você ainda não tenha uma conta, acesse:
https://azure.microsoft.com/pt-br/free/.
Agora, é a vez de publicarmos o projeto Blog Pessoal no Azure. Poderemos
optar por disponibilizar nossa aplicação via Máquina virtual, assim, precisaremos criar
uma VM Windows Server, instalarmos e configurarmos todo o computador, como o
IIS, que aprendemos na seção anterior, juntamente com os recursos do .NET
Framework e do ASP.NET.
26 https://docs.microsoft.com/pt-br/azure/app-service/app-service-web-get-started-dotnet
122
Figure 101: Criar um aplicativo da web do Blog Pessoal no Microsoft Azure.
123
cobrança, escolher o sistema operacional e por último selecionar o plano de serviço do
aplicativo, há vários planos que podem ser configurados.
Figure 102: Visão geral do aplicativo da web do Blog Pessoal no Microsoft Azure.
124
Figure 103: Configurando perfil de publicação para App Service.
Por fim, basta clicar no botão “OK”, e publicar o projeto, ao final do processo
basta acessarmos a url: http://blogpessoal.azurewebsites.net/ e o site será carregado,
conforme demonstra a figura 105.
125
Figure 105: Selecionando o aplicativo da web do Blog Pessoal.
https://www.tshooter.com.br/2016/02/15/voc-desenvolvedor-ento-tem-
azure-de-graa-para-voc/
126
Com o Application Insights coletamos dados de monitoramento dos aplicativos
por meio de uma técnica conhecida como Telemetria.
Ele possibilita o monitoramento de diversos aspectos das aplicações, como:
quantidade de acessos, tempo de resposta, tempo de acesso a recursos externos,
como banco de dados, APIs externas, quantidade de falhas, usuários simultâneos e
outras métricas. Há também a opção de registrar métricas customizadas, ou seja,
podemos criar monitoramento para regras de negócio, como quantos usuários de um
tipo específico acessam a aplicação, quantas requisições retornaram com um
determinado tipo de informação, por exemplo.
Recomendo a seguinte leitura: https://imasters.com.br/apis-
microsservicos/monitorando-apis-com-application-insights-parte-01. Neste artigo, são
detalhados cada recurso disponível no Application Insights.
Leia a documentação oficial pelo link: https://docs.microsoft.com/pt-
br/azure/application-insights/app-insights-overview.
127
3. Qualidade do projeto e outros assuntos importantes
Nas próximas subseções, serão apresentados alguns assuntos importantes que
nós como desenvolvedores devemos conhecer. Alguns destes temas serão mais
detalhados que outros, porém recomendo que você aprofunde seus estudos e em
cada assunto, nem que seja pelo menos para conhecê-los melhor, lembre-se que o
conhecimento é a nossa maior riqueza.
3.1 Rollbar
Muitas vezes quando nossa aplicação apresenta algum erro, a primeira coisa
que nós, desenvolvedores, fazemos é solucioná-lo o mais rápido possível, ainda mais
se for um problema apresentado em ambiente de produção. O recomendável, é que
nós analisemos o erro e encontremos a causa raiz, para solucionarmos o problema de
uma vez por todas e termos cuidado de não gerar outros problemas devido as
alterações realizadas.
Para isso é muito importante estarmos atentos aos erros que acontecem nas
nossas aplicações web, principalmente quando elas estão em produção. Neste cenário,
recomendo que você conheça o Rollbar 27.
O Rollbar facilita a captura dos erros da sua aplicação e as organiza de uma
forma muito simples. É uma ferramenta paga, porém ela oferece um plano gratuito
que aceita até 5.000 registros de erro por mês.
A figura 106 apresenta as capturas de um projeto de exemplo deles, você pode
acessá-lo pelo seguinte endereço: https://rollbar.com/demo/demo/. Navegue e
conheça todos os recursos oferecidos pela ferramenta.
27 https://rollbar.com/
128
Entre todos os recursos disponíveis, vale a pena citar que podemos utilizar o
Rollbar em nossas aplicações ASP.NET por meio de uma biblioteca via Nuget, veja
https://www.nuget.org/packages/Rollbar/.
Recomendo que você faça a seguinte leitura:
https://medium.com/albertomonteiro/capturando-erros-em-producao-no-asp-net-
com-rollbar-2ec9f6fe12e4.
129
Figure 107: Configuração de URL amigável no arquivo RouteConfig.
130
O artigo disponível no endereço abaixo detalha o uso de roteamento baseado
em atributo.
https://blogs.msdn.microsoft.com/webdev/2013/10/17/attribute-routing-in-
asp-net-mvc-5/
Outra questão que devemos abordar é o uso semântico das tags, para isto,
recomendo a leitura do seguinte artigo: https://neilpatel.com/br/blog/tags-htm/.
Neste artigo são abordadas algumas ações que devemos saber durante o
desenvolvimento das nossas Views.
Juntamente com toda a questão de tags e boas práticas, recomendo que você
deixe estruturado os metadados de suas páginas. Conheceremos um pouco sobre o
Schema.org 28, que é uma iniciativa dos três grandes buscadores (Google, Yahoo e
Bing) para oferecer um conjunto de tipos padronizados a serem utilizados com o
formato microdata, como propriedades específicas para artigos. O objetivo do Schema
é se tornar a principal referência na utilização de marcações de conteúdo no HTML.
Como exemplo, estruturaremos nossa página de detalhes dos artigos no
projeto Blog Pessoal seguindo as propriedades que o Schema.org informa por meio
deste link: https://schema.org/Article. Confira a seguir as alterações realizadas na View
de detalhes do Artigo.
28 https://schema.org/
131
• XML Sitemap: listagem de URLs disponíveis para rastreamento e acréscimo
de informações adicionais, como última atualização do site, a frequência de mudanças
e sua importância.
O uso dos arquivos robots.txt e XML Sitemap permite aos motores de busca
rastrear o site de forma mais inteligente.
Use as ferramentas de webmaster para acompanhamento e melhoria de
performance do seu site, como “Google Search Console” e “Bing Webmaster”.
Também utilize a ferramenta “PageSpeed Insights” para verificar a velocidade das
nossas páginas.
Por fim, recomendo que você estude e aplique cada técnica apresentada,
busque também por outras técnicas de SEO que não foram apresentadas neste
material.
29 https://analytics.google.com/analytics/web/
30 https://docs.microsoft.com/pt-br/aspnet/web-api/overview/getting-started-with-aspnet-web-api/tutorial-your-first-web-api
132
comunicação entre os dados é realizado de forma simples, por vezes via Json, com o
uso de métodos GET, POST ou PUT dependendo da requisição solicitada. Centralizar o
acesso às informações, contribui para uso compartilhado dos dados, que ocorre via
acesso ao site e aos aplicativos, desse modo, ambas aplicações realizam as consultas
por REST consumindo da API desenvolvida para retorno dos dados.
Caso você tenha alguma dúvida sobre esta plataforma, recomendo a leitura do
seguinte artigo:
http://www.macoratti.net/16/05/net_mvcwapi.htm
• https://www.tutorialspoint.com/asp.net_mvc/asp.net_mvc_web_api.htm;
• https://www.devmedia.com.br/introducao-ao-asp-net-web-api/25180.
133
4. Certificações Microsoft
Antes de entrarmos nos detalhes da certificação da Microsoft, primeiro vamos
entender o porquê de obter uma certificação. Conquistar uma certificação é afirmar
que você domina determinado assunto e tem ao seu lado uma certificadora que afirma
o seu conhecimento, ou seja, ela assina embaixo garantindo que você fez a prova e foi
aprovado.
Atualmente, vemos o mercado de trabalho da nossa área, Tecnologia da
informação, cada vez mais competitivo. Dessa forma, nos deparamos com um grande
desafio: como posso ser um profissional mais requisitado e competitivo para atender
às exigências do mercado de trabalho?
Nós precisamos nos destacar da concorrência, e um modo de ter algo a mais, é
obter certificados que comprovam a qualidade de um profissional. Nesse contexto, as
certificações Microsoft andam em alta no mercado.
A certificação da Microsoft relacionada com a disciplina estudada, é o Exame
70-486: Developing ASP.NET MVC Web Applications, acesse
https://www.microsoft.com/pt-br/learning/exam-70-486.aspx. Esta prova aborda o
ASP.NET MVC 5, porém apesar do nome não deixar claro, é cobrado muita coisa sobre
o Azure nesta prova também.
O exame abrange uma série de temas diferentes, por isso, caso tenha interesse
em tirar a certificação 70-486, recomendo que você estude firme, dedique-se muito a
cada assunto que tratamos durante o curso e não esqueça de aprofundar cada tópico
solicitado pelo exame.
Deixo alguns links importantes e materiais que podem ser utilizados para sua
preparação:
• https://www.microsoftpressstore.com/store/exam-ref-70-486-developing-
asp.net-mvc-web-applications-9781509300921;
• https://global3.mindhub.com/70-486-developing-asppnet-mvc-web-
applications/p/MU-70-486;
• http://failedturing.blogspot.com/2016/05/microsoft-exam-70-486-study-
guide.html;
• https://www.lambda3.com.br/2016/01/guia-de-estudo-para-certificacao-
microsoft-70-486/;
• https://www.youtube.com/watch?v=pCVOM6kIkLQ
list=PLwftZeDnOzt1LY4pDfrxLYQaRdgZd14hV;
• https://www.pluralsight.com/paths/mvc5.
134
profissionais certificados, além de materiais de divulgação das suas conquistas. A
Microsoft tem programas de auxílio a empresas, como o Microsoft Partner Network
(MPN), que reduz o custo dos produtos da Microsoft utilizados, uma das maneiras de
obter benefícios, e descontos por meio deste programa é pelo número de profissionais
certificados. Assim, vale a pena uma empresa investir na certificação de seus
colaboradores já que também obtém vantagens, desse modo, todo mundo sai
ganhando.
135
5. Dicas e materiais
Recomendo que você acompanhe os artigos dos seguintes sites:
• https://www.codeproject.com/;
• https://www.asp.net/mvc;
• http://netcoders.com.br/;
• https://codigosimples.net/;
• https://imasters.com.br/.
Porém não fiquei limitado apenas nesta lista, há vários outros sites que tratam
do assunto ASP.NET MVC. Geralmente quando você tiver alguma dúvida e sair
pesquisando por uma solução, na maioria das vezes você será redirecionado ao site
https://stackoverflow.com/, por vezes, este site nos acompanhará em nossas dúvidas
e problemas que tivermos.
Há dois canais no YouTube que seria muito interessante que você se inscreve-
se, são eles: Canal dotNET 31 e Coding Night 32. Estes canais oferecem muito conteúdo
de altíssima qualidade e de forma gratuita, são vídeos elaborados por profissionais
com muita experiência no mercado de trabalho.
Há alguns livros que quero te recomendar, para que você possa se aprofundar
nos assuntos aqui abordados:
• Professional ASP.NET MVC 5, dos autores Brad Wilson, David Matson, Jon
Galloway e K. Scott Allen;
31 https://www.youtube.com/channel/UCIahKJr2Q50Sprk5ztPGnVg
32 https://www.youtube.com/channel/UCLoVnmvp0fYn-BCK7yKTxUQ
136
Ao final veja as respostas de todas as questões, reforce os assuntos que ainda
não obteve sucesso, para aprendermos e fixarmos todos os recursos precisaremos de
muita dedicação.
Por fim, estude projetos do GitHub em ASP.NET MVC, ou qualquer outra
tecnologia de seu interesse, aprenda com aquele código, e até tente contribuir,
trabalhar em projetos open-source que são desenvolvidos pela comunidade fará você
crescer bastante. Também é interessante acompanhar os blogs de desenvolvedores,
de empresas de TI e também dos vários MVPs que disseminam o conhecimento de
tecnologias da Microsoft e outras várias.
137
6. Considerações finais
Após toda a implementação realizada, todos os recursos que foram aprendidos,
encerramos nossa disciplina aprendendo um pouco sobre a infra-estrutura utilizada
em nossos projetos para publicarmos nossas aplicações. Desta forma, trabalhamos
todo o ciclo de desenvolvimento de uma aplicação.
Vemos como trabalhar com projetos menores e também algumas práticas
recomendadas para projetos maiores. Aprendemos padrões de projetos, além de
outros recursos que nos ajudam no desenvolvimento. Entendemos da importância de
construirmos software com qualidade e conhecemos ferramentas que nos auxiliam
neste processo, e também metodologias que contribuem para alcançarmos este
objetivo.
Pudemos conhecer a quantidade de recursos disponíveis pelo framework
ASP.NET MVC. Este link disponibiliza os recursos disponíveis, visite sempre que tiver
dúvida ou quiser aprofundar algum assunto, acesse:
https://docs.microsoft.com/pt-br/aspnet/mvc/overview/getting-
started/recommended-resources-for-mvc
138
Referências
[1] Mauricio Aniche. Test-Driven Development: Teste e Design no Mundo Real com. NET. Editora Casa
do Código, 2014.
[2] Everton Coimbra de Araújo. ASP.NET MVC 5. Casa do Código, Maio, 2016.
[3] Andrews Ferreira Bárbara. .net: Entendendo o arquivo web.config, nov. 2018.
[4] Isabel Castillo. Comparison: Create a table with pure vanilla javascript versus jquery, out. 2018.
[5] DEVMEDIA. Asp.net mvc e identity: Autorização de usuários com claims, out. 2018.
[6] Dino Esposito. Programming Microsoft ASP.NET MVC, 3rd Edition. Microsoft Press; 3 edition
(February 25, 2014), 2014.
[7] R. Fielding. Representational state transfer. Architectural Styles and the Design of Netowork-based
Software Architecture, pages 76–85, 2000.
[8] Jon Galloway, Brad Wilson, K. Scott Allen, and David Matson. Professional ASP.NET MVC 5. John
Wiley & Sons, Agosto, 2014.
[10] Renato Haddad. Asp.net - uso de bundle e minification no asp.net mvc 4 e asp.net web forms 4.5,
nov. 2018.
[11] José Carlos Macoratti. Asp.net MVC 5 - usando o atributo uihint - i, nov. 2018.
[12] José Carlos Macoratti. Asp .net MVC - tipos de retorno dos métodos action, out. 2018.
[13] José Carlos Macoratti. Asp .net - apresentando a sintaxe razor para c# e vb .net, nov. 2018.
[14] Zoran Maksimovic. Microsoft.net o/r mapper: choose your own!, nov. 2018.
[16] Microsoft Developer Network. Visão geral do asp.net mvc, set. 2018.
139
[17] Jeffrey Palermo, Ben SCHEIRMAN, and Jimmy BOGARD. ASP.NET MVC em Ação. Editora Novatec,
Janeiro, 2011.
[18] Eduardo Pires. Asp.net MVC - action filters - entendendo e customizando, nov. 2018.
[19] Eduardo Pires. Asp.net MVC - viewdata, viewbag e tempdata, mai. 2018.
[22] Fabio Gomes Rocha. Tdd: fundamentos do desenvolvimento orientado a testes, nov. 2018.
[23] Fabrício Sanchez and Márcio Fábio Althmann. Desenvolvimento web com ASP.NET MVC. Casa do
Código, Novembro, 2013.
[24] Jhonathan Soares. Diferenças entre renderpartial vs renderaction vs partial vs action no mvc, nov.
2018.
[25] Jhonathan Soares. Habilitando compressão gzip com web.config em asp.net, nov. 2018.
[26] Microsoft Visual Studio. Downloads visual studio 2017, ago. 2018.
[28] Júlio Viegas. Teste de software: Introdução, conceitos básicos e tipos de testes, nov. 2018.
140