¡Descarga programacion web orientado a visual studio y más Ejercicios en PDF de Programación Funcional solo en Docsity!
ASP.NET Core Razor
Actualización: 13 de octubre de 2023
Como nota inicial, este proyecto también se realizará con la ideología Code First.
Al abrir Visual Studio, aparecerá la siguiente pantalla donde se debe elegir “ Crear un proyecto ”:
Elegiremos “ Aplicación web ASP.NET Core ”
Esta aplicación se llamará “CoreRazor”
Crearemos una “Aplicación web” simple sin MVC aunque seguiremos muchas convenciones.
Cabe mencionar que no ocuparemos autenticación.
Entity Framework Core
Las aplicaciones .NET Core, como ya se mencionó anteriormente, no usan el framework .NET completo, solo módulos o
partes administradas por Nuget.
Para esta práctica se necesitan los siguientes módulos:
Microsoft.EntityFrameworkCore
Microsoft.EntityFrameworkCore.Abstractions
Microsoft.EntityFrameworkCore.Relational
Microsoft.EntityFrameworkCore.Desginer
Microsoft.EntityFrameworkCore.SqlServer
Microsoft.EntityFrameworkCore.Tools
En cada paquete les pedirá aceptar la licencia de módulos.
Comprobación: en la pestaña “Instalado”, deben aparecer las 3 librerías
Primeros pasos:
Las aplicaciones Code First, implican que la base de datos se creara en función del código y no al revés, por lo tanto
debemos iniciar con la creación de una cadena de conexión, para ello editaremos el archivo “ appsettings.json ” y como
se vio en la practica 16, se debe agregar una cadena de conexión.
En la practica 16 usamos la base de datos “tswcrud”; para no confundirnos usaremos ahora la bd “ tswrazor ” aunque
tengan la misma estructura. Para ello se deben agregar las líneas marcadas en la siguiente imagen.
Cabe mencionar que la cadena JSON llamada Conexión contiene los siguientes valores:
Server : Nombre de su servidor SQL Server (CÁMBIENLO).
Database : nombre de la base de datos, aunque no está creada la usaremos.
User Id : usaremos a “sa”.
Password : la contraseña de “sa”
Trusted_Connection : para marcarla como confiable.
MultipleActiveResultSets : múltiples conexiones simultaneas.
Encrypt : necesario para la conexion
Modelos
Por best practices, se debe crear una carpeta llamada Models.
Sobre el proyecto, presionar clic derecho y en la opción Agregar , desplegar el submenú y seleccionar Nueva Carpeta.
Inmediatamente creara la nueva carpeta la cual deben renombrar como Models.
Dentro de esta carpeta se guardan los Modelos que usaremos.
Modelos: AlumnosModel
Esta clase se muestra a continuación:
[Index(nameof(NC), IsUnique = true, Name = "idx_NC")] [Index(nameof(Nombre), Name = "idx_Nombre")] public class AlumnosModel { public int ID { get; set; } [NotNull] [StringLength(9, ErrorMessage = "Maximo 9 caracteres")] [Required(ErrorMessage = "El NC es obligatorio")] [Display(Name = "Numero de control", Prompt = "00090000")] [RegularExpression(@"^([0-9]{8})$", ErrorMessage = "NC invalido")] [DisplayFormat(DataFormatString = "{0:D8}", ApplyFormatInEditMode = true, HtmlEncode = true, ConvertEmptyStringToNull = false)] public string? NC { get; set; } [NotNull] [ConcurrencyCheck] [StringLength(100, ErrorMessage = "Maximo 100 caracteres")] [Required(ErrorMessage = "El Nombre es obligatorio")] [Display(Name = "Nombre completo", Prompt = "Aqui tu nombre")] public string? Nombre { get; set; } [NotNull] [ConcurrencyCheck] [StringLength(12, ErrorMessage = "Maximo 12 caracteres")] [Required(ErrorMessage = "El Telefono es obligatorio")] [Display(Name = "Telefono control", Prompt = "XXX-XXX-XXXX")] [DataType(DataType.PhoneNumber, ErrorMessage = "Telefono invalido")] [RegularExpression(@"^(\d{3}-\d{3}-\d{4})$", ErrorMessage = "Formato de telefono invalido")] public string? Telefono { get; set; } [NotNull] [ConcurrencyCheck] [StringLength(50, ErrorMessage = "Maximo 50 caracteres")] [Required(ErrorMessage = "El Correo es obligatorio")] [Display(Name = "Email", Prompt = "usuario@correo.com")] [DataType(DataType.EmailAddress, ErrorMessage = "Correo invalido")] public string? Correo { get; set; } [NotNull] [Required(ErrorMessage = "Fecha obligatoria")] [Display(Name = "Fecha")] [DataType(DataType.Date)] public DateTime Fecha { get; set; } [NotNull] [ConcurrencyCheck] [Required(ErrorMessage = "Deuda obligatoria")] [DataType(DataType.Currency, ErrorMessage = "solo formato monetario")] [Column(TypeName = "Money")] [Display(Name = "Deuda")] [DefaultValue(0)] public float Deuda { get; set; } [ConcurrencyCheck] [Required(ErrorMessage = "Promedio obligatorio")] [DefaultValue(0)] [Range(0, 100, ErrorMessage = "promedio fuera de rango")] public float Promedio { get; set; } [Required(ErrorMessage = "Genero obligatorio")] public char Genero { get; set; } public int CarrerasID { get; set; } public CarrerasModel? Carrera { get; set; } [DefaultValue(true)] [Display(Name = "¿Inscrito?")] public bool Inscrito { get; set; } }
Este modelo servirá como para crear la base de datos a trabajar.
Cabe mencionar que cada atributo (Excepto Id) cuenta con anotaciones las cuales servirán para validar su formato y
composición.
El atributo id es necesario ya que se usará como llave primaria de forma automática.
Atributos de validación
Los atributos de validación permiten especificar reglas de validación para las propiedades del modelo.
Atributos integrados
Estos son algunos de los atributos de validación integrados:
[CreditCard]: valida que la propiedad tiene un formato de tarjeta de crédito.
[Compare]: valida que coinciden dos propiedades en un modelo.
[EmailAddress]: valida que la propiedad tiene un formato de correo electrónico.
[Phone]: valida que la propiedad tiene un formato de número de teléfono.
[Range]: valida que el valor de la propiedad se encuentra dentro de un intervalo especificado.
[RegularExpression]: valida que el valor de propiedad coincide con una expresión regular especificada.
Validaciones personalizadas parte 1
En esta primera parte, crearemos una validación desde una clase para después solo insertar la anotación. Para ello
debemos agregar un directorio llamado “ Validations ”
Dentro de ese directorio crearemos una nueva clase
Esta clase se llamará “PrimeraLetraMayuscula”
Y tendrá el siguiente código:
NOTA: 2023/10/11 Se agregaron más validaciones
Para implementarla, se debe agregar la anotación en la clase de modelo “AlumnosModel”
También se puede agregar en “CarrerasModel”
Contextos
Cada Modelo debe contar con un Contexto de Base de datos, Estos contextos no hay ninguna regla que defina su
ubicación, pero para esta práctica se debe crear una carpeta para los Contextos de base de datos llamada Data. (Repitan
el procedimiento de la creación de la carpeta Models ).
Sobre la carpeta Data , presionar clic derecho, seleccionar Agregar , y elegir Clase.
Esta clase se llamará “ AlumnosContext.cs ”
Esta clase se muestra a continuación:
Una instancia DbContext representa una combinación de una unidad de trabajo y un reposito de patterns los cuales pueden ser
usados para realizar querys a una tabla en la base de datos definida en alguna cadena de conexión ( get ), así mismo también se
pueden escribir datos y realizar cambios ( set ).
Esto desplegara una consola en la parte inferior del IDE:
En ella debemos ejecutar los comandos:
add-migration MigracionInicial
update-database
Nota: 2023/10/
Se agregaron datos iniciales a la migración:
En la misma consola de nuget se puede Crear una nueva migración llamada “Datos”
Dentro de la migración vacia generada se pueden crear los datos iniciales:
Esto creara una carpeta llamada Migrations , con algunos archivos, como se muestra en la siguiente imagen.
También en SQL Server creara lo siguiente: (Actualizar imagen)
Una base de datos llamada razor con una tabla llamada alumnos , la cual contiene los campos definidos en el modelo.
Entregar: Capturas (a pantalla completa) de la migración y la base de datos.