ASP .NET Core - CRUD usando Blazor e Entity Framework Core - II
Hoje vamos criar uma aplicação ASP .NET Core com Blazor e realizar um CRUD básico usando o Entity Framework Core 2.0. |
Incluindo as Razor Views na Aplicação Blazor
Clique com o botão direito do mouse sobre o projeto Blazor_Crud.Client/Pages e a seguir selecione Add->New Item;
A seguir selecione o template ASP.NET Core -> Razor View e informe o nome ClientesPage.cshtml;
Para simplificar vamos definir o código para realizar o CRUD somente nesta página.
Ao final a pasta Pages do projeto Blazor_Crud.Client deverá possui os seguintes arquivos:
Definindo o código da página Razor
Vamos agora definir o código da página ClientesPage.cshtml na pasta Pages.
1- ClientesPage.cshtml
Além disso, também forneceremos os métodos Action para Adicionar, Editar e Excluir cada registro de cliente:
@using Blazor_Crud.Shared
@using Blazor_Crud.Shared.Models
@page "/ClientesPage"
@using Microsoft.AspNetCore.Blazor.Browser.Interop
@inject HttpClient Http
<h1> Blazor - CRUD com EF Core</h1>
<hr />
<table width="100%" style="background:#05163D;color:honeydew">
<tr>
<td width="20"> </td>
<td>
<h2>Cadastro de Clientes</h2>
</td>
<td> </td>
<td align="right">
<button class="btn btn-info" onclick="@AddNovoCliente">Incluir Novo Cliente</button>
</td>
<td width="10"> </td>
</tr>
<tr>
<td colspan="2"></td>
</tr>
</table>
<hr />
<form>
<table class="form-group">
<tr>
<td>
<label for="Name" class="control-label">Código</label>
</td>
<td>
<input type="text" class="form-control" bind="@cliente.ClienteId" readonly />
</td>
<td width="20"> </td>
<td>
<label for="Name" class="control-label">Nome</label>
</td>
<td>
<input type="text" class="form-control" bind="@cliente.Nome" />
</td>
</tr>
<tr>
<td>
<label for="Email" class="control-label">Email</label>
</td>
<td>
<input type="text" class="form-control" bind="@cliente.Email" />
</td>
<td width="20"> </td>
<td>
<label for="Pais" class="control-label">Pais</label>
</td>
<td>
<input type="text" class="form-control" bind="@cliente.Pais" />
</td>
</tr>
<tr>
<td>
<button type="submit" class="btn btn-success" onclick="@(async () => await AddCliente())"
style="width:220px;">Salvar</button>
</td>
</tr>
</table>
</form>
<table width="100%" style="background:#0A2464;color:honeydew">
<tr>
<td width="20"> </td>
<td>
<h2>Detalhes dos Clientes</h2>
</td>
</tr>
<tr>
<td colspan="2"></td>
</tr>
</table>
@if ( _clientes == null)
{
<p><em>Carregando...</em></p>
}
else
{
<table class="table">
<thead>
<tr>
<th>Codigo</th>
<th>Nome</th>
<th>Email</th>
<th>Pais</th>
</tr>
</thead>
<tbody>
@foreach (var cli in _clientes)
{
<tr>
<td>@cli.ClienteId</td>
<td>@cli.Nome</td>
<td>@cli.Email</td>
<td>@cli.Pais</td>
<td><button class="btn btn-primary" onclick="@(async () => await EditCliente(@cli.ClienteId))"
style="width:110px;">Editar</button></td>
<td><button class="btn btn-danger" onclick="@(async () => await DeleteCliente(@cli.ClienteId))">
Deletar</button></td>
</tr>
}
</tbody>
</table>
}
@functions {
Cliente[] _clientes;
Cliente cliente = new Cliente();
string ids = "0";
bool exibeLinhaIncluida = false;
//carrega clientes
protected override async Task OnInitAsync()
{
_clientes = await Http.GetJsonAsync<Cliente[]>("/api/Clientes/");
}
//adicionar novo cliene
void AddNovoCliente()
{
cliente = new Cliente();
}
// Adicionar detalhes
protected async Task AddCliente()
{
if (cliente.ClienteId == 0)
{
await Http.SendJsonAsync(HttpMethod.Post, "/api/Clientes/", cliente);
}
else
{
await Http.SendJsonAsync(HttpMethod.Put, "/api/Clientes/" + cliente.ClienteId, cliente);
}
cliente = new Cliente();
_clientes = await Http.GetJsonAsync<Cliente[]>("/api/Clientes/");
}
// Editar
protected async Task EditCliente(int clienteID)
{
ids = clienteID.ToString();
cliente = await Http.GetJsonAsync<Cliente>("/api/Clientes/" + Convert.ToInt32(clienteID));
}
// deletar
protected async Task DeleteCliente(int clienteID)
{
ids = clienteID.ToString();
await Http.DeleteAsync("/api/Clientes/" + Convert.ToInt32(clienteID));
_clientes = await Http.GetJsonAsync<Cliente[]>("/api/Clientes/");
}
}
|
Na parte
superior, incluímos o namespace Blazor_Crud.Shared.Models para que
possamos usar nossa classe de modelo Cliente nessa página.
Estamos definindo a rota desta página usando a diretiva @page. Portanto,
neste aplicativo, se anexarmos "/ClientesPage" na URL base, seremos
redirecionados para esta página. Também estamos injetando o serviço
HttpClient para ativar chamadas de API da Web.
Em seguida, definimos o código HTML para exibir todos os registros dos lientes
de maneira tabular. Também adicionamos dois links de ação para
Editar e Excluir.
Na parte inferior da página, temos uma seção
@functions que
contém nossa lógica de negócios. Criamos uma variável de matriz, cliente,
que é um array de Clientes e a preenchemos dentro do método OnInitAsync
chamando nossa API da Web. Isso será vinculado à nossa tabela HTML no
carregamento da página.
A seguir definimos os métodos usados pela view para realizar o CRUD.
Antes de executar a aplicação altere o código do arquivo NavMenu.cshtml da pasta Shared no projeto Blazor_Crud.Client:
<div class="top-row pl-4 navbar navbar-dark">
<a class="navbar-brand" href="/">Macoratti .net</a>
<button class="navbar-toggler" onclick=@ToggleNavMenu>
<span class="navbar-toggler-icon"></span>
</button>
</div>
<div class=@(collapseNavMenu ? "collapse" : null) onclick=@ToggleNavMenu>
<ul class="nav flex-column">
<li class="nav-item px-3">
<NavLink class="nav-link" href="/" Match=NavLinkMatch.All>
<span class="oi oi-home" aria-hidden="true"></span> Home
</NavLink>
</li>
<li class="nav-item px-3">
<NavLink class="nav-link" href="/ClientesPage">
<span class="oi oi-list-rich" aria-hidden="true"></span>Clientes
</NavLink>
</li>
</ul>
</div>
@functions {
bool collapseNavMenu = true;
void ToggleNavMenu()
{
collapseNavMenu = !collapseNavMenu;
}
}
|
Aqui definimos apenas duas opções no menu: Home e Clientes.
Executando o projeto e acionando o menu Clientes iremos obter:
Podemos melhorar o nosso projeto em diversos sentidos mas para um primeiro contato com o Blazor até que nos saimos bem.
Pegue o projeto aqui : Blazor_Crud.zip
'Agora é o juízo deste mundo; agora será
expulso o príncipe deste mundo.
E eu, quando for levantado da terra, todos atrairei a mim.
E dizia isto, significando de que morte havia de morrer.'
João 12:31-33
Veja os
Destaques e novidades do SUPER DVD Visual Basic
(sempre atualizado) : clique e confira !
Quer migrar para o VB .NET ?
Quer aprender C# ??
Quer aprender os conceitos da Programação Orientada a objetos ? Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ? |
Referências:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#
Super DVD C# - Recursos de aprendizagens e vídeo aulas para C#
Curso Fundamentos da Programação Orientada a Objetos com VB .NET