Neste artigo eu vou apresentar o novo recurso Razor Pages da ASP .NET Core. |
Continuando a primeira parte do artigo vamos usar o projeto Razor Page criado e definir uma aplicação básica para gerenciar informações de clientes.
Nota: O projeto deste artigo foi baseado no original em : https://docs.microsoft.com/en-us/aspnet/core/mvc/razor-pages/?tabs=visual-studio com ajustes e modificações.
Os
recursos das Razor Pages foram projetados para facilitar a utilização dos
padrões comuns usados com os navegadores. Assim o Model
binding, as Tag Helpers e os HTML helpers, todos funcionam com as
propriedades definidas em uma classe Razor Page.
Vamos então partir do projeto padrão criado no artigo anterior e implementar o
CRUD básico para gerenciar informações de Clientes.
Recursos usados:
Ajustando o projeto para gerenciar informações de clientes
Abra o projeto AspnRazorPage1 criado na primeira parte do artigo e inclua uma pasta Models no projeto. (Project-> New Folder)
Crie a classe Cliente que vai representar um cliente do nosso modelo de domínio com o seguinte código:
using System.ComponentModel.DataAnnotations;
namespace AspnRazorPage1.Models
{
public class Cliente
{
public int Id { get; set; }
[Required, StringLength(100)]
public string Nome { get; set; }
}
}
|
A seguir vamos criar a classe de contexto chamada AppDbContext que herda de DbContext na pasta Models com o código abaixo:
using Microsoft.EntityFrameworkCore;
namespace AspnRazorPage1.Models
{
public class AppDbContext : DbContext
{
public AppDbContext(DbContextOptions options) : base(options)
{
}
public DbSet<Cliente> Clientes { get; set; }
}
}
|
Agora vamos configurar o método ConfigureServices da classe Startup.cs definindo a inicialização do DbContext:
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<AppDbContext>(options =>
options.UseInMemoryDatabase("ClientesDados"));
services.AddMvc();
}
|
Registramos o nosso contexto como um serviço e usamos um novo recurso do Entity Framework Core que é o provedor de dados em memória (in-memory). Como nossa aplicação é basicamente um protótipo não precisamos configurar um banco de dados local ou externo, e, por isso vamos usar os dados em memória. (Para isso estamos usando o pacote Microsoft.EntityFrameworkCore.InMemory que já esta incluso no projeto.)
Incluindo uma nova Razor Page : Create.cshtml
Vamos agora incluir uma página chamada Create.chstml na pasta Pages.
Clique com o botão direito do mouse sobre a pasta Pages a seguir clique em Add -> Razor Page
A seguir na janela Add Scaffold clique em Razor Page e a seguir no botão Add;
Na janela Add Razor Page informe o nome Create e marque as opções conforme a figura a seguir:
Clicando no botão Add teremos a view Create.cshtml e seu arquivo code-behind criados na pasta Pages.
Vamos iniciar definindo o código do arquivo code-behind Create.cshtml.cs :
using AspnRazorPage1.Models;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using System.Threading.Tasks;
namespace AspnRazorPage1.Pages
{
public class CreateModel : PageModel
{
private readonly AppDbContext _db;
public CreateModel(AppDbContext db)
{
_db = db;
}
[BindProperty]
public Cliente Cliente { get; set; }
public async Task<IActionResult> OnPostAsync()
{
if (!ModelState.IsValid)
{
return Page();
}
_db.Clientes.Add(Cliente);
await _db.SaveChangesAsync();
return RedirectToPage("/Index");
}
}
}
|
Por convenção, a classe
PageModel é chamada <PageName>Model, no
exemplo: <Create>Model, e está no mesmo
namespace da página.
A classe PageModel permite a separação da lógica
de uma página de sua apresentação. Ela define
manipuladores de página para requisições enviadas para a
página e os dados usados para renderizar a página.
(Esta separação permite gerir dependências de páginas
através da injeção de dependência e testar as páginas.)
A página possui um método OnPostAsync, que é
executado em requisições POST (quando um usuário
publica o formulário). Você pode adicionar métodos
de manipulador para qualquer verbo HTTP.
O sufixo de nomeação Async é opcional, mas
geralmente é usado por convenção para funções
assíncronas. O código OnPostAsync é semelhante ao
que você normalmente escreveria em um controlador. O
código anterior é típico das Razor Pages. A maioria dos
recursos do MVC, como o Model
Binding , a validação e os action results, são
compartilhados.
No método OnPostAsync:
temos a verificação para validação de erros com as
seguintes ações:
1 - Se não houver erros, salva os
dados e faz o redirecionamento
2 - Se houver erros, exibe a página novamente com as
mensagens de validação. (A validação do lado do
cliente é idêntica às feitas nas aplicações ASP.NET Core
MVC. Em muitos casos, erros de validação seriam
detectados no cliente.)
Quando os dados são inseridos com sucesso, o método do manipulador OnPostAsync chama o método helper redirectToPage para retornar uma instância de RedirectToPageResult.
Aqui, RedirectToPage
é um novo action result, semelhante ao
RedirectToAction ou
RedirectToRoute, mas personalizado para páginas.
No código estamos redirecionando para a página Index
da raiz (/Index).
Quando o formulário enviado tiver erros de validação
(que são passados para o servidor), o método
OnPostAsync chama o método Page Helper e Page
retorna uma instância do PageResult.
PageResult é o tipo de retorno padrão para um método
de manipulador. Um método de manipulador que retorna
void renderiza a página.
Observe que a propriedade
Cliente utiliza o atributo [BindProperty]
para ativar o model binding.
Agora abra o arquivo Create.cshtml e inclua o
código abaixo:
@page
@model AspnRazorPage1.Pages.CreateModel
@{
ViewData["Title"] = "Criar";
}
<html>
<body>
<p>
Informe seu nome
</p>
<div asp-validation-summary="All"></div>
<form method="POST">
<div>Nome: <input asp-for="Cliente.Nome" /></div>
<input type="submit" />
</form>
</body>
</html>
|
Por padrão as Razor Pages, vincula as propriedades somente com verbos que não são do tipo GET. Essa vinculação de propriedades pode reduzir a quantidade de código que você precisa escrever, pois ela reduz o código usando a mesma propriedade para renderizar campos de formulário (<input asp-for = "Cliente.Nome" />) e aceita a entrada de dados.
Vamos agora alterar o código da página Index.cshtml existente na pasta Pages conforme abaixo:
@page
@model IndexModel
@{
ViewData["Title"] = "Home page";
}
<h2>Contatos</h2>
<form method="post">
<table class="table">
<thead>
<tr>
<th>ID</th>
<th>Nome</th>
</tr>
</thead>
<tbody>
@foreach (var contato in Model.Clientes)
{
<tr>
<td>@contato.Id</td>
<td>@contato.Nome</td>
<td>
<a asp-page="./Edit" asp-route-id="@contato.Id">Editar</a>
<button type="submit" asp-page-handler="delete" asp-route-id="@contato.Id">Deletar</button>
</td>
</tr>
}
</tbody>
</table>
<a asp-page="./Create">Criar Contato</a>
</form>
|
Nesta view Index.cshtml definimos o PageModel como IndexModel e a propriedade Clientes que será definida no code-behind onde estamos exibindo o Id e Nome do Cliente.
Para editar e/ou deletar usamos o asp-route-id para passar o Id do cliente para a página.
A seguir inclua o código
abaixo no arquivo code-behind Index.cshtml.cs :
using AspnRazorPage1.Models;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.EntityFrameworkCore;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace AspnRazorPage1.Pages
{
public class IndexModel : PageModel
{
private readonly AppDbContext _db;
public IndexModel(AppDbContext db)
{
_db = db;
}
public IList<Cliente> Clientes { get; private set; }
public async Task OnGetAsync()
{
Clientes = await _db.Clientes.AsNoTracking().ToListAsync();
}
public async Task<IActionResult> OnPostDeleteAsync(int id)
{
var contact = await _db.Clientes.FindAsync(id);
if (contact != null)
{
_db.Clientes.Remove(contact);
await _db.SaveChangesAsync();
}
return RedirectToPage();
}
}
}
|
No arquivo code-behind injetamos uma instância do nosso contexto no construtor e definimos os métodos OnGetAsync() para exibir os clientes e OnPostDeleteAsync() que vai localizar o cliente e deletar suas informações.
Executando o nosso projeto neste momento teremos o seguinte resultado:
1- Exibição da view Index.cshtml
2- Exibição da view Create.cshtml após clicar no link - Criar Contato
3- Exibição da view Index.cshtm após incluir um novo contato
Na próxima parte do artigo vamos continuar nossa aplicação criando a página para editar informações do cliente.
Todavia digo-vos a
verdade, que vos convém que eu vá; porque, se eu não
for, o Consolador não virá a vós; mas, quando eu for,
vo-lo enviarei.
E, quando ele vier, convencerá o mundo do pecado, e da
justiça e do juízo.
Do pecado, porque não crêem em mim;
Da justiça, porque vou para meu Pai, e não me vereis
mais;
João
16:7-10
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#
ASP .NET Core - Criando uma aplicação com Angular 2 - Macoratti.net
ASP .NET Core - Criando uma aplicação Web no ... - Macoratti.net
https://docs.microsoft.com/en-us/aspnet/core/mvc/razor-pages/?tabs=visual-studio