En esta pequeña guia, vamos a crear una pequeña aplicacion web usando la arquitectura MVC en ASP.NET Core, en particular un blog. Tutorial basico. Esta guia puede ser seguida en todos los sistemas operativos, con ciertas variaciones, asi que ajustar de acuerdo a la necesidad.
Las herramientas a utilizar en este tutorial son:
Lo primero que debemos hacer es instalar el SDK de .NET Core para el desarrollo de aplicaciones. Para esto, vamos a este enlace y descargamos el apropiado para nuestro equipo. Puedes descargar .NET 5 o .Net Core 3.1, cualquiera de los dos funciona.
Para confirmar que se haya instalado correctamente, abrimos una ventana de PowerShell o Simbolo de Sistema y escribimos:
> dotnet
Deberiamos ver algo similar a esto:
Seguimos con nuestro editor de codigo, para poder desarrollar aplicaciones y lo vamos a configurar para que funcione con el lenguaje por defecto, que es C#. Vamos a este enlace y descargamos el apropiado para nuestro equipo. Para instalar la extension, revisa la documentacion.
Finalmente instalamos esta herramienta que nos permitira visualizar los datos que guardemos en la base de prueba. La podemos descargar de aqui.
.NET Core viene con plantillas para cada una de las posibles aplicaciones que deseemos realizar, desde aplicaciones de consola hasta aplicaciones web. Para esto, en una ventana de comandos escribimos:
> dotnet new mvc -o MiAplicacionWeb
Esto creara una carpeta MiAplicacionWeb donde se encontraran todos los archivos de nuestro proyecto, ya iremos viendolos a medida que avancemos. Probemos que todo este bien, escribimos:
> cd MiAplicacionWeb
> dotnet run
Este ultimo comando construira toda la aplicacion y ejecutara un servidor de pruebas para poder visualizar nuestra aplicacion web en la direccion https://localhost:5000. Presionamos Ctrl+C para terminarlo.
El modelo es un archivo clase que modela los datos a ser almacenados. Tambien puede ser visto como el maquetado de las tablas que se almacenaran en la base de datos. Vamos a crear 3 tablas/modelos: Post, Comment y User. Para esto, creamos los archivos en la carpeta Models con los nombres Post.cs, Comment.cs y User.cs.
// Post.cs
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
namespace MiAplicacionWeb.Models
{
public class Post
{
// Properties
public int ID { get; set; }
public string Titulo { get; set; }
public string Contenido { get; set; }
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
public DateTime Fecha { get; set; }
// Navigation Properties
public User User { get; set; }
public ICollection<Comment> Comments { get; set; }
}
}
// Comment.cs
namespace MiAplicacionWeb.Models
{
public class Comment
{
// Properties
public int ID { get; set; }
public string Lector { get; set; }
public string Contenido { get; set; }
// Navigation Properties
public Post Post { get; set; }
}
}
// User.cs
using System.Collections.Generic;
namespace MiAplicacionWeb.Models
{
public class User
{
// Properties
public int ID { get; set; }
public string Nombre { get; set; }
public string Apellido { get; set; }
public string Email { get; set; }
// Navigation Properties
public ICollection<Post> Posts { get; set; }
}
}
Los siguientes comandos nos podran dar funcionalidad con SQLite y CodeGeneration.
> dotnet tool install --global dotnet-ef
> dotnet tool install --global dotnet-aspnet-codegenerator
> dotnet add package Microsoft.EntityFrameworkCore.Design
> dotnet add package Microsoft.EntityFrameworkCore.SQLite
> dotnet add package Microsoft.VisualStudio.Web.CodeGeneration.Design
> dotnet add package Microsoft.EntityFrameworkCore.SqlServer
> dotnet add package Microsoft.EntityFrameworkCore.Tools
Aplicaremos un scaffolding al modelo Post y actualizaremos los archivos creados.
> dotnet aspnet-codegenerator controller -name PostsController -m Post -dc BlogContext --relativeFolderPath Controllers -udl --referenceScriptLibraries -sqlite
Este comando creara el controlador del modelo Post en la carpeta Controllers, las vistas para Crear, Leer, Editar y Eliminar posts, los cuales encontraremos en Views/Posts y finalmente el adminitrador de sesion con la base de datos BlogContext en la carpeta Data. Asimismo, actualiza los archivos Startup.cs y appsettings.json.
En este paso actualizaremos las plantillas para agregar navegacion hacia el modulo de Posts.
Views/Shared/_Layout.cshtml
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>@ViewData["Title"] - MiAplicacionWeb</title>
<link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.min.css" />
<link rel="stylesheet" href="~/css/site.css" />
</head>
<body>
<header>
<nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
<div class="container">
<a class="navbar-brand" asp-area="" asp-controller="Home" asp-action="Index">MiAplicacionWeb</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target=".navbar-collapse" aria-controls="navbarSupportedContent"
aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="navbar-collapse collapse d-sm-inline-flex justify-content-between">
<ul class="navbar-nav flex-grow-1">
<li class="nav-item">
<a class="nav-link text-dark" asp-area="" asp-controller="Posts" asp-action="Index">Blog</a>
</li>
</ul>
</div>
</div>
</nav>
</header>
<div class="container">
<main role="main" class="pb-3">
@RenderBody()
</main>
</div>
<footer class="border-top footer text-muted">
<div class="container">
© 2021 - MiAplicacionWeb - <a asp-area="" asp-controller="Home" asp-action="Privacy">Privacy</a>
</div>
</footer>
<script src="~/lib/jquery/dist/jquery.min.js"></script>
<script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
<script src="~/js/site.js" asp-append-version="true"></script>
@await RenderSectionAsync("Scripts", required: false)
</body>
</html>
Lo que hemos hecho es eliminar los links de navegacion que se generaron y agregamos uno que nos lleve a nuestro blog.
Ahora debemos actualizar BlogContext.cs para agregar los otros modelos.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using MiAplicacionWeb.Models;
public class BlogContext : DbContext
{
public BlogContext (DbContextOptions<BlogContext> options)
: base(options)
{
}
public DbSet<MiAplicacionWeb.Models.Post> Post { get; set; }
public DbSet<MiAplicacionWeb.Models.Comment> Comment { get; set; }
public DbSet<MiAplicacionWeb.Models.User> User { get; set; }
}
Una vez hecho esto, vamos a crear nuestra primera migracion. Las migraciones son una forma practica de manejar los cambios que se realicen a lo largo del tiempo en la base de datos. Vamos a crear la primera migracion, la cual creara la base y las tablas iniciales, de acuerdo a lo que hemos detallado en los modelos.
> dotnet ef migrations add InitialCreate
> dotnet ef database update
Podemos ejecutar nuestra aplicacion para ver que todo vaya viento en popa, esto es que podemos acceder a la seccion Blog, la cual estara vacia al momento.
Hasta aqui hemos avanzado bastante, hemos visto la creacion de un nuevo proyecto MVC, hemos creado modelos de datos relacionados, hemos modificado las vistas y hemos creado migraciones, para mejor control de versiones de cambios en la estructura de las tablas de la base de datos.
En el siguiente post modificaremos la apariencia del listado de posts y haremos que se muestre la data relacionada en las vistas (como comentarios y datos del autor).