El patrón arquitectónico Model-View-Controller (MVC) es un enfoque ampliamente utilizado para desarrollar aplicaciones web, especialmente con frameworks como ASP.NET Core MVC en C#. Ayuda a separar las preocupaciones de una aplicación, haciéndola más organizada, mantenible y testeable
1. ¿Qué es MVC?
MVC divide una aplicación en tres componentes interconectados:
- Modelo (Model): Gestiona los datos y la lógica de negocio.
- Vista (View): Muestra la interfaz de usuario.
- Controlador (Controller): Maneja la entrada del usuario, interactúa con el Modelo y selecciona la Vista apropiada.
🏗️ Estructura básica de un proyecto MVC
Un proyecto típico de ASP.NET MVC tiene esta estructura de carpetas:
- Controllers/
- HomeController.cs
- Models/
- Usuario.cs
- Views/
- Home/
- Index.cshtml
- wwwroot/
- css/
- js/
- Startup.cs / Program.cs
Flujo del MVC
- El usuario accede a una URL (ej.
/Home/Index
). - El Controlador interpreta la solicitud.
- Si necesita datos, llama al Modelo.
- El Modelo obtiene y devuelve los datos al Controlador.
- El Controlador pasa los datos a la Vista.
- La Vista genera HTML y se lo muestra al usuario.
2. Modelo (Model)
El Modelo es el núcleo de los datos y la lógica de negocio de su aplicación. Representa el “qué” de su aplicación.
Responsabilidad:
Datos: Contiene los datos con los que trabaja la aplicación (por ejemplo, un objeto Product
, una lista de Users
). Estos datos pueden provenir de una base de datos, una API o cualquier otra fuente.
Características:
Independiente de la Vista y el Controlador. No sabe cómo se muestran sus datos o cómo se recibe la entrada del usuario.
Puede notificar a sus observadores (Vistas o Controladores) cuando su estado cambia.
Ejemplo (C# Conceptual):
// Models/Product.cs
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
public int Stock { get; set; }
// La lógica de negocio puede estar aquí,
// por ejemplo, para aplicar un descuento
public decimal GetDiscountedPrice(decimal discountPercentage)
{
if (discountPercentage < 0 || discountPercentage > 100)
{
throw new ArgumentOutOfRangeException(nameof(discountPercentage),
"El porcentaje de descuento debe estar entre 0 y 100.");
}
return Price * (1 - (discountPercentage / 100));
}
}
3. Vista (View)
La Vista es responsable de presentar los datos al usuario. Es el “cómo” de la visualización de su aplicación.
- Responsabilidad:
- Visualización: Renderiza la interfaz de usuario basándose en los datos proporcionados por el Controlador.
- Lógica de Presentación: Contiene lógica principalmente para formatear y mostrar datos (por ejemplo, recorrer una lista para mostrar elementos, renderizado condicional).
- Características:
- Pasiva: No contiene lógica de negocio ni interactúa directamente con el Modelo. Simplemente muestra lo que se le da.
- Puede ser una página web (HTML, CSS, JavaScript), una ventana de escritorio o cualquier otro elemento de la interfaz de usuario. En ASP.NET Core MVC, las Vistas son típicamente archivos Razor (
.cshtml
).
@model YourApp.Models.Product
<h1>Detalles del Producto</h1>
<div>
<p><strong>Nombre:</strong> @Model.Name</p>
<p><strong>Precio:</strong> $@Model.Price</p>
<p><strong>Stock:</strong> @Model.Stock</p>
<p><strong>Precio con Descuento (10%):</strong>
$@Model.GetDiscountedPrice(10)</p>
</div>
<a href="/Product/Index">Volver a la Lista</a>
4. Controlador (Controller)
El Controlador actúa como intermediario entre el Modelo y la Vista. Es el “quién” o “qué” maneja las acciones del usuario.
- Responsabilidad:
- Manejo de Entrada: Recibe las solicitudes del usuario (por ejemplo, una solicitud de URL, un clic de botón).
- Interacción con el Modelo: Llama a métodos en el Modelo para recuperar o actualizar datos basándose en la solicitud del usuario.
- Selección de Vista: Decide qué Vista renderizar y pasa los datos necesarios (del Modelo) a esa Vista.
- Control de Flujo: Gestiona el flujo de la aplicación.
- Características:
- Orquesta la interacción entre el Modelo y la Vista.
- No contiene lógica de negocio en sí mismo (delega al Modelo).
- No contiene lógica de presentación (delega a la Vista).
using Microsoft.AspNetCore.Mvc;
// Suponiendo que el modelo Product está en este espacio de nombres
using YourApp.Models;
using System.Collections.Generic;
using System.Linq;
public class ProductController : Controller
{
// En una aplicación real,
// esto provendría de una base de datos o un servicio
private static List<Product> _products = new List<Product>
{
new Product { Id = 1, Name = "Laptop", Price = 1200.00m, Stock = 50 },
new Product { Id = 2, Name = "Ratón", Price = 25.00m, Stock = 200 },
new Product { Id = 3, Name = "Teclado", Price = 75.00m, Stock = 100 }
};
// Maneja las solicitudes GET a /Product/Index
public IActionResult Index()
{
// El Controlador obtiene datos del "Modelo" (aquí, una lista estática)
// En una aplicación real, se llamaría a un servicio o repositorio
return View(_products); // Pasa la lista de productos a la Vista
}
// Maneja las solicitudes GET a /Product/Details/{id}
public IActionResult Details(int id)
{
// El Controlador pide al Modelo datos específicos
var product = _products.FirstOrDefault(p => p.Id == id);
if (product == null)
{
return NotFound();
// Devuelve un 404 si el producto no se encuentra
}
return View(product); // Pasa un solo producto a la Vista
}
// Maneja las solicitudes POST a /Product/Create
// (por ejemplo, después de un envío de formulario)
[HttpPost]
public IActionResult Create(Product newProduct)
{
if (ModelState.IsValid) // Comprueba si los datos enviados son válidos
{
// Asigna un nuevo ID (en una aplicación real,
// esto sería manejado por la DB)
newProduct.Id = _products.Any() ? _products.Max(p => p.Id) + 1 : 1;
_products.Add(newProduct);
return RedirectToAction("Index");
// Redirige a la lista de productos después de la creación
}
return View(newProduct);
// Si es inválido, vuelve al formulario con errores
}
}
5. Cómo Interactúan
- Interacción del Usuario: Un usuario interactúa con la Vista (por ejemplo, hace clic en un enlace, envía un formulario).
- Solicitud al Controlador: El navegador envía una solicitud al servidor, que se enruta a la acción del Controlador apropiada.
- El Controlador Procesa: El Controlador recibe la solicitud.
- Podría recuperar datos del Modelo (por ejemplo,
productService.GetProduct(id)
). - Podría actualizar datos en el Modelo (por ejemplo,
productService.SaveProduct(newProduct)
).
- Podría recuperar datos del Modelo (por ejemplo,
- El Controlador Selecciona la Vista: Basándose en el resultado, el Controlador decide qué Vista mostrar.
- La Vista Renderiza: El Controlador pasa los datos necesarios (a menudo un objeto Modelo o una colección de objetos Modelo) a la Vista. La Vista luego usa estos datos para renderizar la interfaz de usuario.
- Respuesta al Usuario: La Vista renderizada (HTML, CSS, JS) se envía de vuelta al navegador del usuario.
6. Ventajas de MVC
- Separación de Preocupaciones: Separa claramente los datos, la lógica y la presentación, lo que hace que el código sea más fácil de entender, gestionar y escalar.
- Modularidad: Los componentes pueden desarrollarse y probarse de forma independiente.
- Testeabilidad: Debido a que los componentes están separados, es más fácil escribir pruebas unitarias para la lógica del Modelo y del Controlador sin necesidad de interactuar con la interfaz de usuario.
- Mantenibilidad: Los cambios en un componente (por ejemplo, actualizar la interfaz de usuario) son menos propensos a afectar a otros.
- Reutilización: Los Modelos y Controladores a menudo pueden reutilizarse en diferentes vistas o incluso en diferentes aplicaciones.
- Desarrollo Paralelo: Diferentes equipos o desarrolladores pueden trabajar en Modelos, Vistas y Controladores simultáneamente
¿Cuál es la diferencia entre la lógica de negocio y la lógica de presentación, y en qué capas del MVC se ubican?
¿Cuál es la principal ventaja de usar el patrón MVC en aplicaciones web como las desarrolladas con ASP.NET Core?
¿Que alternativas a ASP.NET MVC existen para desarrollar aplicaciones web en C#?
¿Cómo se integran los servicios o repositorios en un proyecto MVC con base de datos?
Cual es la diferecia entre html, css , javaScrip?
¿Qué es ViewData, ViewBag y TempData, y cuándo debería usar cada uno?
QUE CARACTERISTICA PUEDE TENER UNA VISTA ?
Cual es la ventaja de usar el patrón MVC
¿Qué sucede cuando el navegador envía una solicitud al servidor en una aplicación basada en el patrón MVC?
¿Quién es el que se encarga de seleccionar qué Vista qué se mostrará al usuario en el patrón MVC?
¿Qué problemas podrían surgir si no se utiliza el patrón MVC en una aplicación web desarrollada con ASP.NET Core?
¿Cuál sería la principal diferencia al desarrollar una aplicación web con ASP.NET Core MVC sin utilizar Entity Framework (o cualquier otro ORM) para acceder a la base de datos, en comparación con usarlo?