Proyecto Web .
NET MVC con modelos complejos y herencias
Como nota inicial, estoy usando la versión 16.5.1 de visual studio 2019, no se cuando salió, pero si algo no les funcionan
actualicen su versión.
Al abrir Visual Studio 2019, aparecerá la siguiente pantalla donde se debe elegir “Crear un proyecto”:
Para filtrar de aplicación ASP .NET (.NET Framework) usaremos la búsqueda “MVC”
El nombre del proyecto será “tsw20”, algo importante a considerar es: el tipo de proyecto requiere como mínimo .NET
Framework 4.5, pero el que aparezca por default superior a 4.5 es suficiente.
Nuestro tipo de proyecto debe ser MVC ya que hay muchas posibilidades en un proyecto de este tipo.
No usaremos autenticación.
Sobre la carpeta “Models”, hay que agregar clases para cada uno de los 7 modelo, por ejemplo:
Sobre “Models” se despliega el menú contextual presionando el botón derecho del mouse, sobre él, se selecciona
“Agregar” y del sub menú, se selecciona “Clase”
Clase Persona
La primera clase se llamará “Persona”
Y contendrá este código:
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Web;
namespace modeloComplejo.Models
{
public class Persona
{
public int ID { get; set; }
[Required(ErrorMessage = "El Nombre es obligatorio")]
[StringLength(50, ErrorMessage = "Maximo 50 caracteres en el nombre.")]
[Column("Nombre")]
[Display(Name = "Nombres")]
public string Nombre { get; set; }
[Required(ErrorMessage = "El Apellido es obligatorio")]
[StringLength(50, ErrorMessage = "Maximo 50 caracteres en el apellido.")]
[Display(Name = "Apellidos")]
public string Apellido { get; set; }
[Display(Name = "Nombre Completo")]
public string NombreCompleto
{
get
{
return Apellido + ", " + Nombre;
}
}
}
}
Clase Profesor
La segunda clase se llamará “Profesor”
Y contendrá este código:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace modeloComplejo.Models
{
public enum Titulo
{
Licenciado, Ingeniero, Maestro, Doctor
}
public class Profesor : Persona
{
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
[Display(Name = "Fecha de Contratacion")]
public DateTime FechaContratacion { get; set; }
[DisplayName("Grado Academico")]
public Titulo? Titulo { get; set; }
// public virtual ICollection<Curso> Cursos { get; set; }
// public virtual ActividadesOficina actividadesOficina { get; set; }
}
Clase Curso
La cuarta clase se llamará “Curso”
Y contendrá este código:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Web;
namespace modeloComplejo.Models
{
public class Curso
{
public int ID { get; set; }
[StringLength(50, MinimumLength = 3)]
[DisplayName("Nombre del curso")]
public string NombreCurso { get; set; }
[Range(0, 5)]
public int Creditos { get; set; }
public int? DepartmentID { get; set; }
// public virtual Departamento Departmento { get; set; }
// public virtual ICollection<Inscripcion> Inscripciones { get; set; }
// public virtual ICollection<Profesor> Profesores { get; set; }
}
}
Clase ActividadesOficina
La tercera clase se llamará “ActividadesOficina”
Y contendrá este código:
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Web;
namespace modeloComplejo.Models
{
public class ActividadesOficina
{
[Key]
[ForeignKey("Profesor")]
public int ProfesorID { get; set; }
[StringLength(50)]
[Display(Name = "Ubicacion de Oficina")]
public string Ubicacion { get; set; }
// public virtual Profesor Profesor { get; set; }
}
}
Clase Departamento
La quinta clase se llamará “Departamento”
Y contendrá este código:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Web;
namespace modeloComplejo.Models
{
public class Departamento
{
public int ID { get; set; }
[StringLength(50, MinimumLength = 3)]
[DisplayName("Nombre del Departamento")]
public string Name { get; set; }
[DataType(DataType.Currency)]
[Column(TypeName = "money")]
public decimal Presupuesto { get; set; }
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
[Display(Name = "Fecha de inicio")]
public DateTime FechaInicio { get; set; }
public int? ProfesorID { get; set; }
/*[Timestamp]
public byte[] RowVersion { get; set; }*/
// public virtual Profesor Administrador { get; set; }
// public virtual ICollection<Curso> Cursos { get; set; }
}
}
Clase Estudiante
La Sexta clase se llamará “Estudiante”
Y contendrá este código:
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;
namespace modeloComplejo.Models
{
public class Estudiante : Persona
{
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
[Display(Name = "Fecha de Inscripcion")]
public DateTime FechaInscripcion { get; set; }
// public virtual ICollection<Inscripcion> Inscripcion { get; set; }
}
}
Clase Inscripcion
La Septima clase se llamará “Inscripcion”
Y contendrá este código:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;
namespace XApr17.Models
{
public enum Calificacion
{
reprobado = 0,
suficiente = 70,
regular = 80,
bueno = 90,
excelente = 100
}
public class Inscripcion
{
public int ID { get; set; }
[DisplayName("Curso")]
public int? CursoID { get; set; }
[DisplayName("Alumno")]
public int? EstudianteID { get; set; }
[DisplayFormat(NullDisplayText = "Sin Calificacion")]
public Calificacion? Calificacion { get; set; }
// public virtual Curso curso { get; set; }
// public virtual Estudiante estudiante { get; set; }
}
}
Controladores
Antes iniciar con la creación de controladores, debemos compilar el proyecto:
Se deben crear controladores para:
1. Profesor
2. ActividadesOficina
3. Departamento
4. Estudiante
5. Curso
6. Inscripcion
El modelo Persona no tendrá controlador ya que es una super Modelo del cual heredan otros modelos.
Sobre la carpeta “Controllers” se despliega el menú contextual presionando el botón derecho del mouse, sobre él, se
selecciona “Agregar” y del sub menú, se selecciona “Controlador”
Todos los controladores que creemos serán “Controlador de MVC 5 con vistas que usan Entity Framework”
DepartamentosController
Este será el primer controlador a crear y por lo tanto al momento de que pregunte los datos debemos especificar “Clase
Modelo”, habilitar “Usar acciones de controlador asíncrono” y como nombre “DepartamentosController”.
Necesitamos crear un contexto de datos, pero no tenemos ninguno, presionaremos el botón “+” marcado en rojo y
automáticamente generar un contexto el cual usaremos en los siguientes controladores.
Al crear el primer controlador y contexto, hará una pequeña descarga, sean pacientes.
Antes de continuar con la creación de controladores, debemos compilar el proyecto:
ProfesoresController
Debemos especificar “Clase Modelo”, habilitar “Usar acciones de controlador asíncrono” y como nombre
“ProfesoresController”.
ActividadesController
Debemos especificar “Clase Modelo”, habilitar “Usar acciones de controlador asíncrono” y como nombre
“ActividadesController”.
EstudiantesController
Debemos especificar “Clase Modelo”, habilitar “Usar acciones de controlador asíncrono” y como nombre
“EstudiantesController”.
CursosController
Debemos especificar “Clase Modelo”, habilitar “Usar acciones de controlador asíncrono” y como nombre
“CursosController”.
InscripcionesController
Debemos especificar “Clase Modelo”, habilitar “Usar acciones de controlador asíncrono” y como nombre
“InscripcionesController”.
Creando Migraciones y BD
Para crear las migraciones y la bd, debemos entrar a la “Consola del Administrador de paquete” de Nuget
Dentro debemos escribir estos comandos:
Modificando la Navegacion
Para poder invocar una vista es necesario usar el tag: @Html.ActionLink
Su formato es el siguiente:
@Html.ActionLink(“Texto a mostrar”,”Nombre del método ActionResult”,”Nombre del Controlador sin la
palabra Controller”)
Para realizar las invocaciones en la barra de navegación, primero debemos abrir la vista:
“/Views/Shared/_Layout.cshtml”
Y colocar el siguiente contenido agregando o sustituyendo las secciones diferentes:
Hagan sus pruebas :D