Asp.NET Core: Passo a passo (Básico)
Download .NET
Para fazer o download do .NET Core acesse www.microsoft.com/net, feito isso na tela inicial aparecerá um link para download, clique sobre ele e abrirá uma nova janela.
Faça download da última versão disponível e faça a instalação logo após.
Nessa mesma página você também pode baixar todas versões disponível do .NET Framework Full, também IDE do Visual Studio e Visual Code, essa página foi a melhor coisa que pode acontecer, tudo que eu preciso está aqui, tornando mais fácil a vida de quem precisa fazer um download.
IDE de desenvolvimento
Neste artigo estou utilizando o Visual Studio Community 2017 15.5.1, mais você pode utilizar uma mais atualizada ou Visual Code, que é uma IDE Open source e super leve, se você querer utilizar o Visual Code acessi aqui: https://code.visualstudio.com/?wt.mc_id=DX_841432
Criando um projeto
Estarei mostrando a você como criar uma pequena aplicação usando Asp.NET Core + SQLite, não estarei me aprofundando em muitos detalhes, nosso objetivo aqui é apenas mostrar como criar um aplicação passo-a-passo, para aqueles que estão iniciando.
Existem vários artigos na internet sobre como criar uma aplicação, mais muitos iniciantes, que estão chegando ao mundo .NET Core, ainda tem dificuldades, então isso me motivou a fazer um PASSO-A-PASSO de uma aplicação simples do ZERO.
This is a simple application, but with it you will learn how to Add, Update, Delete and List a Customer ( Basic ) record.
All of our step-by-step will be illustrated by images from the IDE for easy reading, let's create our project.
Notes : This is a project intended for people who are learning Asp.Net Core.
Open your Visual Studio and let's start ...
After clicking OK we will have the following structure in our project.
Let's create our classes , follow the steps below.
Class Code - CrudBasicoNETCoreMVC.Models
https://i0.wp.com/ralmsdeveloper172900781.files.wordpress.com/2017/12/07.png
using System.ComponentModel.DataAnnotations;
namespace CrudBasicoNETCoreMVC.Models
{
public class Situacoes
{
[Key]
public int Id { get; set; }
public string Descricao { get; set; }
public bool Ativo { get; set; }
}
}
Class Code - CrudBasicoNETCoreMVC.Models
using System.ComponentModel.DataAnnotations;
namespace CrudBasicoNETCoreMVC.Models
{
public class Clientes
{
[Key]
public int Id { get; set; }
[StringLength(100)]
public string Nome { get; set; }
[StringLength(100)]
public string Apelido { get; set; }
[StringLength(100)]
public string Endereco { get; set; }
[StringLength(100)]
public string Bairro { get; set; }
[StringLength(2)]
public string Estado { get; set; }
[StringLength(100)]
public string Cidade { get; set; }
public string Observacoes { get; set; }
public int SituacaoId { get; set; }
public Situacoes Situacao { get; set; }
}
}
Let's create our class responsible for accessing the database .
Database Class Code
https://i0.wp.com/ralmsdeveloper172900781.files.wordpress.com/2017/12/10.png
using Microsoft.EntityFrameworkCore;
namespace CrudBasicoNETCoreMVC.Models
{
public class CrudDbContext : DbContext
{
public DbSet<Clientes> Clientes { get; set; }
public DbSet<Situacoes> Situacoes { get; set; }
public CrudDbContext(DbContextOptions<CrudDbContext> options)
{ }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (!optionsBuilder.IsConfigured)
{
optionsBuilder.UseSqlite("DataSource=crudnetcoremvc.db");
}
base.OnConfiguring(optionsBuilder);
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder
.Entity<Clientes>()
.HasOne(p => p.Situacao);
base.OnModelCreating(modelBuilder);
}
}
}
Let's now create the Customers and Situations folders for our Views .
Now let's create our View Code.
View Code
https://i0.wp.com/ralmsdeveloper172900781.files.wordpress.com/2017/12/11.png
https://i0.wp.com/ralmsdeveloper172900781.files.wordpress.com/2017/12/12.png
https://i0.wp.com/ralmsdeveloper172900781.files.wordpress.com/2017/12/13.png
https://i0.wp.com/ralmsdeveloper172900781.files.wordpress.com/2017/12/14.png
https://i0.wp.com/ralmsdeveloper172900781.files.wordpress.com/2017/12/15.png
@model CrudBasicoNETCoreMVC.Models.Clientes
@{
var estados = CrudBasicoNETCoreMVC.Util.Estados;
}
<p class="card">
<p class="header">
<h4 class="title">Editar Cadastro</h4>
</p>
<p class="content">
<form asp-action="Gravar" role="form">
<p class="row">
<p class="col-md-2">
<p class="form-group">
<label>Código</label>
<input asp-for="@Model.Id" type="text" class="form-control border-input disabled" readonly value="@Model.Id">
</p>
</p>
<p class="col-md-5">
<p class="form-group">
<label>Nome do Cliente</label>
<input asp-for="@Model.Nome" type="text" class="form-control border-input" placeholder="Nome" value="@Model.Nome">
</p>
</p>
<p class="col-md-5">
<p class="form-group">
<label for="exampleInputEmail1">Apelido</label>
<input asp-for="@Model.Apelido" type="text" class="form-control border-input" placeholder="Apelido" value="@Model.Apelido">
</p>
</p>
</p>
<p class="row">
<p class="col-md-6">
<p class="form-group">
<label>Endereço</label>
<input asp-for="@Model.Endereco" type="text" class="form-control border-input" placeholder="Endereço" value="@Model.Endereco">
</p>
</p>
<p class="col-md-6">
<p class="form-group">
<label>Bairro</label>
<input asp-for="@Model.Bairro" type="text" class="form-control border-input" placeholder="Bairro" value="@Model.Bairro">
</p>
</p>
</p>
<p class="row">
<p class="col-md-6">
<p class="form-group">
<label>Cidade</label>
<input asp-for="@Model.Cidade" type="text" class="form-control border-input" placeholder="Cidade" value="@Model.Cidade">
</p>
</p>
<p class="col-md-2">
<p class="form-group">
<label>Estado</label>
<select asp-for="@Model.Estado" asp-items="@estados" class="form-control border-input"></select>
</p>
</p>
<p class="col-md-4">
<p class="form-group">
<label>Situação</label>
<select asp-for="@Model.SituacaoId" asp-items="@ViewBag.Situacoes" class="form-control border-input"></select>
</p>
</p>
</p>
<p class="row">
<p class="col-md-12">
<p class="form-group">
<label>Obervações</label>
<textarea asp-for="@Model.Observacoes" rows="5" class="form-control border-input" placeholder="">@Model.Observacoes</textarea>
</p>
</p>
</p>
<p class="text-center">
<button type="submit" class="btn btn-danger btn-fill btn-wd">Gravar</button>
<a class="btn btn-danger btn-icon btn-fill btn-wd" asp-controller="clientes" asp-action="index"><i class="fa fa-undo"></i></a>
</p>
<p class="clearfix"></p>
</form>
</p>
</p>
View code - Index.cshtml
Once this is done, create another View named Index.cshtml by following the previous step.
@using CrudBasicoNETCoreMVC.Models
@model List<Clientes>
<p class="row">
<p class="col-md-12">
<p class="card">
<p class="header">
<h4 class="title">Clientes</h4>
<p class="category">
Exibe lista dos clientes cadastrados
<a class="btn btn-sm btn-success btn-icon" asp-controller="clientes" asp-action="editar" asp-route-id="0">Novo</a>
</p>
</p>
<p class="content table-responsive table-full-width">
<table class="table table-striped">
<thead class="text-primary" style="background-color: beige">
<tr>
<th>Ação</th>
<th>Nome</th>
<th>Endereço</th>
<th>Cidade</th>
<th>Estado</th>
<th>Situação</th>
</tr>
</thead>
<tbody>
@foreach (var item in Model)
{
<tr>
<td>
<a class="btn btn-sm btn-danger btn-icon" asp-controller="clientes" asp-action="editar" asp-route-id="@item.Id"><i class="fa fa-pencil-square-o"></i></a>
<a class="btn btn-sm btn-danger btn-icon" asp-controller="clientes" asp-action="excluir" asp-route-id="@item.Id"><i class="fa fa-trash-o"></i></a>
</td>
<td>@item.Nome</td>
<td>@item.Endereco</td>
<td>@item.Cidade</td>
<td>@item.Estado</td>
<td>@item.Situacao.Descricao</td>
</tr>
}
</tbody>
</table>
</p>
</p>
</p>
</p>
After you create the View Index.cshtml, repeat the same steps for the Situations folder.
View - Edit.cshtml - Situations
@model CrudBasicoNETCoreMVC.Models.Situacoes
<p class="card">
<p class="header">
<h4 class="title">Editar Situação</h4>
</p>
<p class="content">
<form asp-action="Gravar" role="form">
<p class="row">
<p class="col-md-2">
<p class="form-group">
<label>Código</label>
<input asp-for="@Model.Id" type="text" class="form-control border-input disabled" readonly value="@Model.Id">
</p>
</p>
<p class="col-md-5">
<p class="form-group">
<label>Descrição da Situação</label>
<input asp-for="@Model.Descricao" type="text" class="form-control border-input" placeholder="Descrição" value="@Model.Descricao">
</p>
</p>
<p class="col-md-5">
<p class="form-group">
<label for="exampleInputEmail1">Status</label>
<input asp-for="@Model.Ativo" type="checkbox" class="form-control border-input" value="@Model.Ativo">
</p>
</p>
</p>
<p class="text-center">
<button type="submit" class="btn btn-danger btn-fill btn-wd">Gravar</button>
<a class="btn btn-danger btn-icon btn-fill btn-wd" asp-controller="situacoes" asp-action="index"><i class="fa fa-undo"></i></a>
</p>
<p class="clearfix"></p>
</form>
</p>
</p>
View - Index.cshtml - Situations
@using CrudBasicoNETCoreMVC.Models
@model List<Situacoes>
<p class="row">
<p class="col-md-12">
<p class="card">
<p class="header">
<h4 class="title">Clientes</h4>
<p class="category">
Exibe situações cadastradas
<a class="btn btn-sm btn-danger btn-icon" asp-controller="situacoes" asp-action="editar" asp-route-id="0"><i class="fa fa-plus"></i></a>
</p>
</p>
<p class="content table-responsive table-full-width">
<table class="table table-striped">
<thead class="text-primary" style="background-color: beige">
<tr>
<th>Ação</th>
<th>Descrição</th>
<th>Ativo</th>
</tr>
</thead>
<tbody>
@foreach (var item in Model)
{
<tr>
<td>
<a class="btn btn-sm btn-danger btn-icon" asp-controller="situacoes" asp-action="editar" asp-route-id="@item.Id"><i class="fa fa-pencil-square-o"></i></a>
<a class="btn btn-sm btn-danger btn-icon" asp-controller="situacoes" asp-action="excluir" asp-route-id="@item.Id"><i class="fa fa-trash-o"></i></a>
</td>
<td>@item.Descricao</td>
<td>@item.Ativo</td>
</tr>
}
</tbody>
</table>
</p>
</p>
</p>
</p>
Let's now create our **Controller **
Code class controller situations:
https://i0.wp.com/ralmsdeveloper172900781.files.wordpress.com/2017/12/controller01.png
https://i0.wp.com/ralmsdeveloper172900781.files.wordpress.com/2017/12/controller02.png
using CrudBasicoNETCoreMVC.Models;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using System.Linq;
namespace CrudBasicoNETCoreMVC.Controllers
{
public class SituacoesController : Controller
{
private CrudDbContext _crudContext;
public SituacoesController(CrudDbContext crudContext)
{
_crudContext = crudContext;
}
public IActionResult Index()
{
var situacoes = _crudContext.Situacoes.AsNoTracking().ToList();
return View(situacoes);
}
public IActionResult Excluir(int id)
{
var situacao = _crudContext.Situacoes.Single(p => p.Id == id);
_crudContext.Remove(situacao);
_crudContext.SaveChanges();
return RedirectToAction("Index");
}
public IActionResult Editar(int id)
{
var situacao = _crudContext.Situacoes.FirstOrDefault(p => p.Id == id) ?? new Situacoes();
return View(situacao);
}
public IActionResult Gravar(Situacoes situacao)
{
if (situacao.Id > 0)
{
_crudContext.Update(situacao);
}
else
{
_crudContext.Add(situacao);
}
_crudContext.SaveChanges();
return RedirectToAction("Editar", new { id = situacao.Id });
}
}
}
Follow the previous step to create the Controller clients as well.
Client controller class code
using CrudBasicoNETCoreMVC.Models;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.EntityFrameworkCore;
using System.Linq;
namespace CrudBasicoNETCoreMVC.Controllers
{
public class ClientesController : Controller
{
private CrudDbContext _crudContext;
public ClientesController(CrudDbContext crudContext)
{
_crudContext = crudContext;
}
public IActionResult Index()
{
var clientes = _crudContext
.Clientes
.Include(i => i.Situacao)
.AsNoTracking()
.ToList();
return View(clientes);
}
public IActionResult Excluir(int id)
{
var cliente = _crudContext.Clientes.Single(p => p.Id == id);
_crudContext.Remove(cliente);
_crudContext.SaveChanges();
return RedirectToAction("Index");
}
public IActionResult Editar(int id)
{
ViewBag.Situacoes = _crudContext
.Situacoes
.Select(c => new SelectListItem() { Text = c.Descricao, Value = c.Id.ToString() })
.ToList();
var cliente = _crudContext.Clientes.FirstOrDefault(p => p.Id == id) ?? new Clientes();
return View(cliente);
}
public IActionResult Gravar(Clientes cliente)
{
if (cliente.Id > 0)
{
_crudContext.Update(cliente);
}
else
{
_crudContext.Add(cliente);
}
_crudContext.SaveChanges();
return RedirectToAction("Editar", new { id = cliente.Id });
}
}
}
This will create a class called " Util " to insert the list of states in it. Code of the class Util.cs: Notes: in another article I will show details about the SelectListItem
https://i0.wp.com/ralmsdeveloper172900781.files.wordpress.com/2017/12/util01.png
using Microsoft.AspNetCore.Mvc.Rendering;
using System.Collections.Generic;
namespace CrudBasicoNETCoreMVC
{
public class Util
{
public static List<SelectListItem> Estados = new List<SelectListItem>
{
new SelectListItem { Value="AC", Text = "Acre"},
new SelectListItem { Value="AL", Text = "Alagoas"},
new SelectListItem { Value="AP", Text = "Amapá"},
new SelectListItem { Value="AM", Text = "Amazonas"},
new SelectListItem { Value="BA", Text = "Bahia"},
new SelectListItem { Value="CE", Text = "Ceará"},
new SelectListItem { Value="DF", Text = "Distrito Federal"},
new SelectListItem { Value="ES", Text = "Espírito Santo"},
new SelectListItem { Value="GO", Text = "Goiás"},
new SelectListItem { Value="MA", Text = "Maranhão"},
new SelectListItem { Value="MT", Text = "Mato Grosso"},
new SelectListItem { Value="MS", Text = "Mato Grosso do Sul"},
new SelectListItem { Value="MG", Text = "Minas Gerais"},
new SelectListItem { Value="PA", Text = "Pará"},
new SelectListItem { Value="PB", Text = "Paraíba"},
ew SelectListItem { Value="PR", Text = "Paraná"},
new SelectListItem { Value="PE", Text = "Pernambuco"},
new SelectListItem { Value="PI", Text = "Piauí"},
new SelectListItem { Value="RJ", Text = "Rio de Janeiro"},
new SelectListItem { Value="RN", Text = "Rio Grande do Norte"},
new SelectListItem { Value="RS", Text = "Rio Grande do Sul"},
new SelectListItem { Value="RO", Text = "Rondônia"},
new SelectListItem { Value="RR", Text = "Roraima"},
new SelectListItem { Value="SC", Text = "Santa Catarina"},
new SelectListItem { Value="SP", Text = "São Paulo"},
new SelectListItem { Value="SE", Text = "Sergipe"},
new SelectListItem { Value="TO", Text = "Tocantins"}
};
}
}
Startup.cs
One more thing, we will have to add some method calls (Dependency injection) in our Startup.cs , in the ConfigureServices method accessing this:
services
.AddEntityFrameworkSqlite()
.AddDbContextPool<Models.CrudDbContext>(o => o.UseSqlite("DataSource=crudnetcoremvc.db"));
using (var dbScope = services.BuildServiceProvider().GetService<Models.CrudDbContext>())
{
dbScope.Database.EnsureCreated();
}
It should now look something like this:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services
.AddEntityFrameworkSqlite()
.AddDbContextPool<Models.CrudDbContext>(o => o.UseSqlite("DataSource=crudnetcoremvc.db"));
using (var dbScope = services.BuildServiceProvider().GetService<Models.CrudDbContext>())
{
dbScope.Database.EnsureCreated();
}
}
_Layout.cshtml
To finish we will create the link in the file _Layout.cshtml to access the pages of clients and situations, the code of the file is this here:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>@ViewData["Title"] - CrudBasicoNETCoreMVC</title>
<environment include="Development">
<link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
<link rel="stylesheet" href="~/css/site.css" />
</environment>
<environment exclude="Development">
<link rel="stylesheet" href="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.7/css/bootstrap.min.css"
asp-fallback-href="~/lib/bootstrap/dist/css/bootstrap.min.css"
asp-fallback-test-class="sr-only" asp-fallback-test-property="position" asp-fallback-test-value="absolute" />
<link rel="stylesheet" href="~/css/site.min.css" asp-append-version="true" />
</environment>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
</head>
<body>
<nav class="navbar navbar-inverse navbar-fixed-top">
<p class="container">
<p class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a asp-area="" asp-controller="Home" asp-action="Index" class="navbar-brand">CrudBasicoNETCoreMVC</a>
</p>
<p class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li><a asp-area="" asp-controller="Clientes" asp-action="Index">Clientes</a></li>
<li><a asp-area="" asp-controller="Situacoes" asp-action="Index">Situação</a></li>
</ul>
</p>
</p>
</nav>
<p class="container body-content">
@RenderBody()
<hr />
<footer>
<p>© 2017 - CrudBasicoNETCoreMVC</p>
</footer>
</p>
<environment include="Development">
<script src="~/lib/jquery/dist/jquery.js"></script>
<script src="~/lib/bootstrap/dist/js/bootstrap.js"></script>
<script src="~/js/site.js" asp-append-version="true"></script>
</environment>
<environment exclude="Development">
<script src="https://ajax.aspnetcdn.com/ajax/jquery/jquery-2.2.0.min.js"
asp-fallback-src="~/lib/jquery/dist/jquery.min.js"
asp-fallback-test="window.jQuery"
crossorigin="anonymous"
integrity="sha384-K+ctZQ+LL8q6tP7I94W+qzQsfRV2a+AfHIi9k8z8l9ggpc8X+Ytst4yBo/hH+8Fk">
</script>
<script src="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.7/bootstrap.min.js"
asp-fallback-src="~/lib/bootstrap/dist/js/bootstrap.min.js"
asp-fallback-test="window.jQuery && window.jQuery.fn && window.jQuery.fn.modal"
crossorigin="anonymous"
integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa">
</script>
<script src="~/js/site.min.js" asp-append-version="true"></script>
</environment>
</body>
</html>
Here's our final project running.
Download
Download link for the project: https://gallery.technet.microsoft.com/Crud-Passo-a-Passo-AspNet-4287d07b
https://i0.wp.com/ralmsdeveloper172900781.files.wordpress.com/2017/12/final.png
https://i0.wp.com/ralmsdeveloper172900781.files.wordpress.com/2017/12/final01.png