Según como lo define la propia Microsoft, ASP.NET Core es un marco multiplataforma de código abierto y de alto rendimiento que tiene como finalidad compilar aplicaciones modernas conectadas a Internet y habilitadas para la nube.

Entre las posibilidades que ofrece, destacan las siguientes:

  • Compilar servicios y aplicaciones web, aplicaciones de Internet de las cosas (en inglés, Internet of Things, simplificado como IoT) y back-ends móviles.
  • Usar sus herramientas de desarrollo favoritas en Windows, macOS y Linux.
  • Efectuar implementaciones locales y en la nube.
  • Ejecutar en .NET Core.

En ASP.NET Core MVC, los controladores son elementos de código que se utilizan para definir y agrupar acciones, lo que permite definir la lógica o las reglas de funcionamiento de la aplicación de ASP.NET Core.

Por convenio, siempre que se trabaja en ASP.NET, los controladores se guardan todos en una carpeta llamada Controllers y siempre se utiliza el sufijo Controller en el nombre del controlador correspondiente (por ejemplo, PacienteController.cs, AccountController.cs o ArticulosController.cs).

Al crear el Controlador, siempre tiene que heredar de la clase Controller:

Construcción de un controlador.

En la imagen anterior se puede apreciar que la clase pública del controlador AccountController hereda de la clase base Controller, recuadrada en rojo.

En una arquitectura Modelo-Vista-Controlador, es el Controlador el que procesa los datos que le llegan desde el modelo, tales como, por ejemplo, la edad, el nombre, el ID (identificador único para cada uno de los elementos de la base de datos)… El Controlador instancia todos esos datos y los maneja para devolver el resultado que se espera en cada uno de los métodos que forman parte de éste.

Crear un controlador con Visual Studio 2019 es muy sencillo. De forma nativa, al crear un proyecto de tipo ASP.NET Core MVC habrá una carpeta llamada Controllers, en la cual al hacer clic secundario mostrará un menú desplegable con la opción Agregar, tras la cual se mostrará otro desplegable y la primera opción será la del Controlador.

Creación de un Controlador en un proyecto ASP.NET Core MVC con Visual Studio 2019.

También hay otros controladores que traen código ya implementado o que tienen funcionalidades diferentes al controlador por defecto. Para añadir uno al proyecto se navega al mismo menú Agregar, dentro de la carpeta Controllers, seleccionando esta vez la opción Nuevo elemento… en la que se mostrará una ventana emergente donde se podrá seleccionar el nuevo elemento entre una gran variedad de opciones posibles, navegando en este caso a Visual C#, ASP.NET Core y Web:

Creación de un Controlador Web en Visual Studio 2019. Algunos traen código ya implementado para operaciones CRUD.

También es importante que el Controlador tenga acceso a la base de datos con la que va a trabajar, de tal manera que pueda realizar operaciones CRUD (siglas en inglés de Create, Read, Update and Delete; en español, Crear, Leer, Actualizar y Eliminar) con los elementos de la base de datos, ya que el controlador va a poder añadir nuevos elementos, eliminarlos o actualizarlos.

La instanciación de la base de datos se realiza a través de una variable privada de solo lectura y un método constructor que recibe esa variable e instancia la base de datos para poder obtener los datos que hay en ella.

Instanciación de la base de datos en un proyecto .NET Core MVC con Visual Studio 2019.

Aunque no es obligatorio, conviene realizar una validación del modelo a través de la propiedad ModelState.IsValid con un condicional if-else, ya que en caso contrario conviene no seguir adelante con la ejecución del proyecto hasta que esté correcto.

Por lo general, los métodos que se programan dentro de un controlador devuelven una instancia sincrónica (IActionResult) o asincrónica (Task<IActionResult>) de los que obtiene una respuesta.

En los Controladores se pueden hacer redireccionamientos a una acción a través de Redirect, RedirectToAction o RedirectToRoute. Por ejemplo:

Redireccionamiento a una acción y a una vista en un método asincrónico, que evalúa si el modelo es válido o no.

En la imagen anterior se ve un método público y asincrónico, que es Create(), y que dependiendo de si se cumple la condición del if, se devuelve a una acción (RedirectToAction) o se devuelve una Vista (View).

De esta manera, al completarse el método su acción final es redirigir a la acción de otro Controlador, como en este caso, que el método Create() redirige a la acción Index() del mismo Controlador. Nótese que en el caso de que la acción redirija a otro controlador siempre se debe poner primero la acción y luego el controlador. Por ejemplo:

Redirección de un método que conduce a un método Index en otro controlador llamado, en este caso, EnfermeraController.cs.

En el caso de que se quiera que la acción responda con un cuerpo no vacío, es decir, que proporcione algún tipo de contenido al realizarse la ejecución del método, se utilizan los comandos de retorno return View(elemento) o return Json(elemento) si lo que se quiere es una vista o un elemento con formato JSON.

Para esta entrada del blog TechClub Tajamar y del videotutorial se ha elaborado un proyecto ASP.NET Core con lenguaje C# que simula ser el sistema gestor de un centro de salud, donde las entidades son los pacientes, médicos y enfermeras, además de haber una entidad para los fármacos administrados a los pacientes.

El código de esta aplicación se ha subido al repositorio GitHub y es accesible para todo aquel que quiera consultarlo haciendo clic aquí.

La intención es que un paciente pueda ver la medicación que tiene pautada por su médico de cabecera, al igual que a un médico o a una enfermera se le asignan los nuevos pacientes que van llegando al centro de salud, de tal manera que un paciente no puede tener más de un médico o enfermera al mismo tiempo. Con respecto a la medicación, la relación es muchos a muchos porque un paciente puede tomar muchos medicamentos y un medicamento puede ser tomado por muchos pacientes.

La interfaz de usuario es sencilla, mostrando una tabla para cada una de estas cuatro entidades (pacientes, médicos, enfermeras y medicamentos), además de dos entidades para la gestión de usuarios y roles, que son por sí mismos entidades y que solamente puede gestionar el administrador del sitio web.

Listado y gestión de los pacientes para el proyecto de esta entrada del blog.

Para el caso de los Controladores, cada una de estas entidades tiene su propio Controlador, por lo que el recuento de controladores en este proyecto es el siguiente:

  1. AccountController.cs.
  2. EnfermeraController.cs.
  3. MedicacionController.cs.
  4. MedicoController.cs.
  5. PacienteController.cs.
  6. RoleController.cs.

Esto sin contar al Controlador que viene por defecto con .NET Core MVC, que es HomeController.cs, aunque para este proyecto no se le ha dado ningún uso.

Cada uno de estos Controladores está compuesto a su vez por diferentes acciones o métodos en cuyos fragmentos de código está la lógica de operación con esa entidad.

Por ejemplo, existe un método Create() en el Controlador de los médicos, MedicoController.cs, cuyo código es:

Código para la creación de un método Create() en el Controlador MedicoController.cs.

Este método Create() tiene una acción emisora y una acción receptora. En la primera de ellas se devuelve una Vista (Create.cshtml, cuya ruta es Views\Medico\Create.cshtml) donde está el formulario de creación y cuando el usuario pulsa sobre el botón del submit, invocando el verbo POST (de ahí el [HttpPost] como encabezado) se llama a este método Create() que ejecuta una acción de manera asincrónica por la que se comprueba si el estado del modelo es válido (ModelState.IsValid) y, en caso de serlo, se añade ese nuevo médico creado a la base de datos y se redirige a la página de inicio, que es Index.cshtml, dentro de Views\Medico.

Un Controlador puede tener tantas acciones o métodos como sean necesarios para la correcta ejecución y funcionamiento del programa. Estos métodos pueden necesitar de métodos ya existentes en otros controladores, razón por la que se hace necesario utilizar la conexión con la base de datos del programa y enlazar así todas las tablas que sean necesarias.

Por otra parte, cabe destacar que cualquier método que haya dentro de un Controlador es accesible desde el navegador web, es decir, tecleando el nombre del método y su correspondiente Controlador se puede navegar hasta esa acción sin necesidad de que haya botones o enlaces en la aplicación que guíen al usuario hasta ese destino, lo cual puede suponer un problema de seguridad si el método es público, ya que un usuario puede probar varios nombres de métodos y llegar a una parte interna de la aplicación y comprometerla.

Para ilustrar esto con un ejemplo, supóngase el controlador de roles, RolesController.cs, donde hay un método que es DeleteUserRole(), que permite al administrador del sitio web suprimir el rol a un usuario de la plataforma (por ejemplo, a un trabajador que cambia su lugar de trabajo a otro centro se le puede eliminar el rol sin necesidad de eliminar la ficha completa del usuario de la base de datos). Si el método es público significa que es accesible, por lo que una persona puede navegar a una hipotética dirección URL http://aplicacion.es/controlador/método y eliminar el rol del administrador o asignarse a sí mismo el rol de administrador y tomar el control del sitio web. Es aquí donde surge la necesidad de utilizar la autorización de usuarios.

Navegación web al índice de usuarios de la aplicación del centro de salud.

Por ejemplo, se puede establecer que todos los métodos de un solo Controlador sean accesibles a todos los usuarios que únicamente tengan un rol determinado o bien que método a método se autorice o desautorice a usuarios según la necesidad del sitio web.

Siguiendo con el ejemplo anterior, sería lógico que los Controladores AccountController.cs y RoleController.cs estén restringidos únicamente para el administrador del sitio web, con las excepciones de los métodos Login(), Logout() y AcessDenied(), que deberían ser visibles para cualquier usuario (en el caso de esta aplicación).

Para concluir, se puede hacer un símil de la arquitectura Modelo-Vista-Controlador como si fuera un vehículo, donde el Modelo son cada una de las piezas, como las ruedas, los engranajes, las lunas; la Vista es el aspecto final del coche, que se verá como un coche de color verde con lunas tintadas y el Controlador es toda la lógica que permite el correcto funcionamiento de este coche, es decir, que al insertar la llave y girarla se arranque el motor, que al dar al botón de las luces de intermitencia éstas se enciendan o que al pisar los pedales de acelerador y freno hagan las acciones que se esperan del coche.

Ninguna de las partes de la arquitectura MVC es más importante que la otra ni ninguna de ellas puede funcionar por separado. Son todas igual de necesarias e imprescindibles.

Los Controladores esconden una infinidad de posibilidades, al permitir introducir tantas acciones o métodos como sean necesarios, siendo estas acciones fácilmente integrables en las correspondientes Vistas y dando una gran versatilidad a los programas, permitiendo que cada uno sea diferente a nivel de código, aunque a nivel de funcionalidad sea igual.


Esta entrada para el blog TechClub Tajamar ha sido elaborada por:

  • Autor: David Mencía Doukech
  • Curso: Desarrollo Web Full Stack, MultiCloud y Multiplataforma
  • Centro: Tajamar
  • Año académico: 2021-2022

Leave a Comment

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.