0% acharam este documento útil (0 voto)
32 visualizações11 páginas

Curso ASP.NET Core MVC: Estruturas e Práticas

Enviado por

Tarso Coelho
Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato TXT, PDF, TXT ou leia on-line no Scribd
0% acharam este documento útil (0 voto)
32 visualizações11 páginas

Curso ASP.NET Core MVC: Estruturas e Práticas

Enviado por

Tarso Coelho
Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato TXT, PDF, TXT ou leia on-line no Scribd

DT.

20211010
DS. Documento de anotações ao longo do estudo.
WORKTIME.

CURSO 1: NÉLIO ALVES

Aula 1. ASP.NET Core MVC

(1) Web Services Vs (2) Template Engine

1. Servidor(back) e navegador(front), SPA (Single Page Application), uso de


Frameworks e Libs JS. Devolve em JSON. Objetos javascript. Intenso uso de
javascript.

Tecnologias: React, Angular, Vue.js, jQuery.

2. Maior responsabilidade do backend, com construção das telas. O backend já


devolve o html
para montagem da tela.

Tecnologias: cada linguagem utiliza um template MVC, no caso C# trabalha com


ASP.NET Core, telas
em Razor Engine.

Aula 2. MVC

Model (Domain/DAL): estrutura dos dados e suas transformações. Composto de


entidades (objetos mapeados), serviços e
repositórios (data). Contém a regra de negócios em seus
serviços e entidades.

Controller(BLL/Business): recebe e trata os dados, meio de campo entre View e


Model. Faz as chamadas ao sistema.
View (UI): gera o html, telas de interação.

ENTITY FRAMEWORK

ORM da tecnologia .NET Core.

Provivers: SQL Server, MySQL, Oracle Database etc.

Classes pricipais: (1)DbContext e (2)DeSet<TEntity>

Sendo 1: encapsula uma sessão (conexão) com um serviço de banco de dados, permite
consultar e salver entidades no database,
define as entidades que farão parte do modelo de dados do sistema
(DbSets)
define configurações.
operações de acesso a dados.
meio de campo entre a aplicação e o banco de dados.

Sendo 2: coleção de entidades de um determinado tipo em um contexto, corresponde a


uma tabela do banco
de dados. São acessados através do DbContext.

Aula 3. Estrutura do Projeto

.cshtml > páginas razor que aceitam marcação html e código em c#.
Código c# sempre entre @{}.
Router: Controller/ação/id (opcional)
* Cada método do controlador é mapeado para uma ação.
* Todo controlador herda de Controller.
* Atenção para a fidelidade ao sistema de nomenclaturas, ex. nome da Pasta em Views
deve ser igual ao nome
do Controller ex. Departments e DepartmentsController.
* O nome da view também deve ser igual ao nome do método declarado em Controller.
* @foreach possível usar em uma coleção já construindo o html.

Natural Template: a requisição é recebida pelo controlador que carrega a view


(.cshtml).

IActionResult: interface genérica para todo resultado de alguma ação.

Aula 4: CRUD Scaffolding

Adicionar item scaffolding com MVC Controller, com views usando Entity Framework.

String de conexão com o banco apontando para SQL em appsettings.json >


ConnectionStrings
e startup métodos UseSqlServer().

Aula 5: Migration

Script para gerar e versionar a base de dados.

Code First (Objetos criam a estrutura de database).


Database First (Objetos replicam os esquemas já criados no database via ling. SQL).

Aula 6: Adaptando para MySQL:

1. Atualizar string de conexão:

"server=localhost;userid=developer;password=;database=;" - BASE

"server=localhost;userid=developer;password=07800319;database=DB_SALES_MANAGER;" -
EDITED

Em Startup.cs
-----------------------------------------------------------------------------------
-------------------------------------------------
services.AddDbContext<SalesManagerContext>(options =>

options.UseMySql(Configuration.GetConnectionString("SalesManagerContext"), builder
=> builder.MigrationsAssembly("SalesManager")));
-----------------------------------------------------------------------------------
-------------------------------------------------
Comando no Gerenciador de Pacotes nuget

Install-Package Pomelo.EntityFrameworkCore.MySql -Version 2.1.1


-----------------------------------------------------------------------------------
----------------------------------------------------------------

Verificar em Windows -> Ferramentas Administrativas -> Serviços se o MySql está em


execução.
Nesta etapa do projeto, basta realizar a migration, que consiste em gerar as
tabelas no DB com
base nos objetos C#.

-----------------------------------------------------------------------------------
-------------------------------------------------
Comando no Gerenciador de Pacotes nuget

#1 Add-Migration Initial
#2 Update-Database
-----------------------------------------------------------------------------------
----------------------------------------------------------------
* Remove-Migration to undo.

Após está ação, a tabela aparecerá no banco de dados e será possível realizar as
operações de CRUD
por meio das telas e sistema automaticamente criados.

Aula 7: Mudando tema no bootstrap.

Em http://bootswatch.com/3

Realizar download do bootstrap.css referente ao tema escolhido.

Aula 8: Inserindo novas entidades e segunda migration

a. Implementar regra de negócio


b. Adicionar DbSets nos DbContexts
c. Nova Migration

Aula 9: Serviço de Seeding

Populando base de dados.


Injetar dependência em Startup.cs

Obs: Migration deve ser usada para criar a estrutura das tabelas.

Aula 10: Novo Aba Sellers

Cria o listItem no layout.cshtml, definindo a rota para o controlador e ação.


Cria controlador na pasta Controller.
Cria a view.

Aula 11: SellerService e FindaAll síncrono

Guarda operações e regras de negócio relativas à Sellers.

Alterar configuração atual onde o controlador faz chamadas ao Entity Framework,


dependência a DbContext.
O controlador deverá apenas receber e encaminhar requisições, sem implementar
regras de negócio e acesso
a dados em Context.

As classes services sempre possuem dependência para a Context, e realizam as


operações de acesso a dados.
Os controladores então passam a chamar as classes services por meio de
dependências, e passam os dados
para view via parâmetro.
Gerar html para a view index com a tabela, laços foreach e chamadas a Html.Display,
asp actions etc.

Aula 12: Ação Create, inserindo novos vendedores.

1. Atentar para estrutura geral do programa e a relação entre as camadas baseadas


na fidelidade de nomenclatura,
além do conjunto de operações automáticas em background. Ex, ao inserir o
vendedor não é necessário montar o
objeto com base nos campos digitados, pois a view já é de Seller, e já realiza a
geração automática do objeto com
base nos campos, definidos no cshtml.

Aula 13: Integridade referencial.

Implementação de chave estrangeira não nula.

NEXT: Gerar html para visualização do departamento do Seller.

Aula 14: View Model e Select de Department

View Model > objeto composto contendo informações de duas ou mais entidades, apenas
para visualização. Pode ter
outros dados também, criados na hora.

Obs: Ao criar um novo serviço, não esquecer de adicionar ao escopo via


services.AddScope<S>()

Aula 15: Saller Details e Eager Loading

O Entity é capaz de realizar uma atualização no banco de dados, em um objeto de


mesmo Id, apenas
chamando _context.Update(), passando o objeto com as alterações no campo já
realizadas. Ele acha
o objeto ao qual este novo objeto está fazendo referência e atualiza.

Obs: Controller é usado tanto para solicitar operações em Services (com return
RedirectToAction), que diz respeito a mudança de informações
no banco de dados como também em relação a passar objetos para montagem das
telas (com return View(obj)).

Aula 16: Adicionar localização e formatação de data.

Bibliotecas definidas em startup.cs:

using System.Globalization;
using Microsoft.AspNetCore.Localization;

Configuração inserida na classe startup.cs.

Obs: Possível ADICIONAR DATA ANNOTATIONS NOS CAMPOS DOS MODELOS, para definir COMO
SERÃO EXPRESSOS OS NOMES DOS CAMPOS.
[Display(Name = "ex...")]

Aula 17: Validações


Adicionar tags específicas para validações de campos, ex. Required e StringLenght.
Necessário ainda realizar adições ao documento cshtml.

Aula 17: Conversão de operações síncronas em assíncronas.

Adicionar tags específicas para validações de campos, ex. Required e StringLenght.


Necessário ainda realizar adições ao documento cshtml.

O que deve ser assíncrono?


Operações de acesso a: disco, dados ou rede.
Assincrono não é igual a multithread.
Tasks encapsulam o processamento assíncrono.
Palavras chave: async e await
retornos ficam Task<Retorno> e void apenas Task
usar sufixo Async nos nomes dos métodos
se tiver retorno, vira return await ...
se tiver operação de acesso a dados, optar pela versão async ex. ToList ->
ToListAsync.
await em toda operação que for para esperar uma operação anterior.

* Mudança dos métodos para Async gerou problemas em algumas operações de CRUD, deve
ser feito com mais
cautela, apenas em operações de carregamento de dados para visualização.

Aula 18: Assegurando integridade referencial.

Aula 19: Novo Controller SallersRecords

Seles Record (model) => SalesRecordsController (plural + Controller) : Nomenclatura


EF

IQueryable, herda de IEnumerable mas é especializado em consultas no Db. Possível


realizar a montagem da
consulta utilizando expressões from, select, in etc. Ex.

IQueryable result = from obj in _context.SalesRecord select obj;

Conversão ex.

Síncrono

public List<Department> FindAll()


{
return _context.Department.OrderBy(x =>x.Name).ToList();
}

Assíncrono

public async Task<List<Department>> FindAllAsync()


{
return await _context.Department.OrderBy(x =>x.Name).ToListAsync();
}

+ INFO
Estrutura de Dependências

|Data (Context)| <- |Services| <- |Controller| -> |View|

Implementação HTTP:

asp-action: define qual método será chamado no controlador ao executar uma


deperminada ação a partir
do front end. Se a implementação consiste em chamar uma outra
tela, esta deve ter o nome
da ação, ex. View > Create.cshtml.

asp-route-id: define qual parâmetro será passsado para a próxima tela na rota.

+ CONTENT

NET Core(1) e Framework(2)

.Sendo 1 e 2: tecnologias para desenvolvimento utilizando a linguagem de


programação C#.
.Sendo 1 e 2: (ASP MVC, Web Forms, Windows Form. Monodeveloper, Xamarim etc).
.Sendo 1 é multiplataforma, enquanto 2 é apenas Windows.
.Sendo 1 não possui alguns componentes do anterior, "Core".

ASP.NET Core e Framework

. Sendo 1, apoiado no .NET Core, open source, multiplataforma, fácil integração com
outros frameworks
client side (Angular JS, KnockoutJS e Bootstrap), são suporta Web Forms.
Modularidade, com fácil inclusão
de pacotes via nuget, npm etc.

CURSO 2: HUGO VASCONCELOS (ASP.NET c/ MVC 5)

<MVC>

Model: data objects, entidades, comunicação com data.


View: front end.
Controller: regra de negócio, meio de campo.

Obs: Modelo MVC é orientado a database.


Obs: Projeto do curso criado com .NET Framework.

<Arquitetura de PASTAS Default>

App_Data > comunicação banco de dados


App_Start > bundle(roda scripts js e css, ex. estilo, configs, validate etc.),
filter (msg de erro) e route (endereçamento).
possível incluir arquivos js na configuração de bundle,
passando o mapeamento do diretório...
Content > arquivos css, imgs etc.
fonts
MVC pastas...
Scripts > arquivos js.
Em Global.asax > entry point da aplicação
Em Web.config > arquivo de configuração.

ROTA: controller/action/id
<Controller>

Carrega as Views.

Nomenclatura: HomeController, sendo (NomeController).


Herda de Controller
O que tem: guarda os métodos IActionResult, que retornam Views dentro do projeto.

<View>
Pasta (Nome do Controller) > cshtml (nome da ação).

<Requisições>

GET > puxar info database.


POST/SET > passar (update/insert) info database.

Obs: [HttpPost], method="GET", comunicação View -><- Controller. Funciona sem


também, quando
usado deste modo. Sendo GET, variáveis, entra na URL.
Sendo POST, + proteção, n entra na URL.

<Helpers>

Simulam tags, funções Html.

Ex.
-----------------------------------------------------------------------------------
---------
@RenderPage("cshtml path") // permite renderizar um doc html a partir de outro,
concatenando infos
e Html.Partial("cshtmlDocName") // permite chamar o trecho html e passar params
-----------------------------------------------------------------------------------
-------------
@Html.ActionLink("Voltar", "Index", "Home"); // Sendo p1 nome, p2 action, p3
controller.
-----------------------------------------------------------------------------------
-------------
@Html.LabelFor(x => x.Name) // referência ao nome dos campos em @model
-----------------------------------------------------------------------------------
-------------
<form action="Home/List" method="POST"> pode ser substituido por;

@using (Html.BeginForm("List", "Home", FormMethod.Post)) // Formulário


{
(content...)
}
-----------------------------------------------------------------------------------
-------------
<input type="text" value="@Model.Name" name="Name"/>
-----------------------------------------------------------------------------------
-------------

<Passando Valores entre as camadas>

1. ViewData, 2. ViewBag e 3.View Tipada

Sendo 1, em Controller, IActionResult Index


-----------------------------------------------------------------------------
var person = new Person() { Name = "Tarso", Age = 23, Type = "rich"};
ViewData["Name"] = person.Name;
-----------------------------------------------------------------------------

Obs: Necessário usar o mesmo nome.

Na view Index:
-----------------------------------------------------------------------------
<p>Nome Usuário: @ViewData["Name"]</p>
-----------------------------------------------------------------------------

Sendo 2, em Controller, IActionResult Index


-----------------------------------------------------------------------------------
-
var person = new Person() { Name = "Tarso", Age = 23, Type = "rich"};
ViewBag.Name = person.Name;
-----------------------------------------------------------------------------------
-
Na view Index
-----------------------------------------------------------------------------------
-
<p>Nome Usuário: @ViewBag.Name</p>
-----------------------------------------------------------------------------------
-
Obs: igual ao anterior, pequena diferença de sintaxe.

Sendo 3, em Controller, IActionResult Index


-----------------------------------------------------------------------------------
-
var person = new Person() { Name = "Tarso", Age = 23, Type = "rich"};
return View(person);
-----------------------------------------------------------------------------------
-
Na view Index
-----------------------------------------------------------------------------------
-
@model AspMvcIntro2.Models.Person
<p>Nome Usuário: @Model.Name</p>
-----------------------------------------------------------------------------------
-

<Recebendo Valores com View Tipada e FormCollection>

Na View
-----------------------------------------------------------------------------------
---------
<input type="text" value="@Model.Name" name="Name"/>
-----------------------------------------------------------------------------------
---------
Em Controller
-----------------------------------------------------------------------------------
---------
public ActionResult List(/*string Name*/FormCollection form)
{
//ViewData["Name"] = newName;
var person = new Person() { Name = form["Name"], Age = 23, Type =
"rich" };
return View(person);
}
-----------------------------------------------------------------------------------
--------------------------------
Obs: Atentar para o name do parâmetro na tag input, em View. É usado para recuperar
depois, em form[""].

Com View Tipada


-----------------------------------------------------------------------------------
-----
public ActionResult List(/*string Name*//*FormCollection form*/ Person
person)
{
//ViewData["Name"] = newName;
var person1 = new Person() { Name = person.Name, Age = 23, Type =
"rich" };
return View(person);
}
-----------------------------------------------------------------------------------
-----
Funciona apenas com View tipada.

<Validações c/ ASP>

1. Em cada propriedade.
2. No formulário.

Tratativas em Controller usando ModelState;


-----------------------------------------------------------------------------------
------------------------------------
[HttpPost]
public ActionResult Index(User user)
{
if (string.IsNullOrEmpty(user.Name))
ModelState.AddModelError("", "O campo campo é obrigatório!");
// acima, ao passar string vazia no param da propriedade, a msg é exibida no
ValidationSummary

// Validação de campos.
if (ModelState.IsValid)
{
// Caso seja válido, é chamado a View Result, conforme passado via
parâmetro,
// passando o usuário igualmente com a mensagem de erro nos campos.
return View("Result", user); // Referência em string a View Result.
}
else
return View(user);
}
-----------------------------------------------------------------------------------
-------------------------------------------
Obs: É possível inserir essas validações dentro da própria classe modelo, via
DataAnnotations, como expressões
regulares, range, campo Required, compare, remote (referência a uma função)
etc.

<Validação com Jquery e Validate>

Realiza os testes em tempo real, sem enviar requisições ao servidor, em tempo real.
ANOTAÇÕES FINAIS

Em MVC,
Model guarda entidade e serviços, coração do sistema e regra de negócio.
Controller; receber e tratar interações do usuário.
View; telas, resposta final.
Em Model -> Entidades, Serviços e DAOs

Tipos de Web App


Web Services (JS libraries) x Template Services

Em C#
C# -> Asp.NET Core -> Páginas Razor

Entity Framework ORM


resolver problema de app em POO e database relacional (tabelas).

DbContext: acesso ao banco de dados, definição dos DbSets


DbSet<T>: coleção de entidades

Código C# nas páginas Razor: @{}...

Tema do Bootstrap

Obter css em

https://bootswatch.com/#VERSAO_CSS#/

Colar em wwwroot > lib > bootstrap > dist > css

NOTES

Obs: a. Há algumas pequenas diferenças no setup do ASP.NET Framework e o Core, na


hora da criação do projeto.
b. Razor, sintaxe usada para criar páginas web dinâmicas com C#, cshtml.
c. Helpers é código C# que ajuda a montar o html, de modo mais dinâmico,
compondo o front end e
d. comunicação com os controladores.
e. ~/, acesso à pasta raiz do site.
f. _ como prefixo para docs cshtml evita que o caminho da url seja acessado
diretamente,
g. contrária a programação do site.
h. Possível separar o sistema em diversas áreas.
i. Há momentos em que é necessário adicionar novos namespaces à MapRoute.
j. FORTE ASSOCIAÇÃO por NOMES.
k. .NET Framework encontra-se na versão 5
l. .NET Core encontra-se na versão 3.1

MYSQL CONFIG
user name: developer
port: 3306
root password: 07800319

Você também pode gostar