que-son-y-como-usar-controlers-aspnet

Qué son y cómo usar controladores en ASP.NET

  • 3 min

Un controlador es un concepto ampliamente usado ASP.NET. Un controlador es una clase que gestiona las solicitudes HTTP entrantes y devuelve una respuesta.

Es decir, básicamente un controlador es el fragmento de código que se encargar de recibir solicitudes y devolver respuestas asociadas a un endpoint.

Para ello, los controladores se componen de métodos, que llamamos acciones, que son las son responsables de manejar cada una de las solicitudes (GET, POST, etc).

En resumen, los controladores:

  1. Reciben solicitudes: Capturan las solicitudes entrantes, como GET, POST, PUT, DELETE, etc.
  2. Procesan la lógica de negocio: Ejecutan la lógica necesaria para manejar la solicitud (como consultar una base de datos o realizar cálculos).
  3. Devuelven una respuesta: Generan y devuelven una respuesta HTTP (una vista HTML, datos en formato JSON)

Tipos de controladores en ASP.NET Core

En ASP.NET un controlador es una clase que hereda de la clase base ControllerBase (para APIs) o Controller (para aplicaciones MVC).

Existen dos tipos principales de controladores:

Característica✅ Controladores APIControladores MVC
HerenciaControllerBaseController
Retornos típicosJSON, XMLHTML (vistas)
Decoración requerida[ApiController]Ninguna necesaria
Interacción principalAPI REST, clientes HTTPNavegadores

Controladores para API

Los controladores de API están diseñados para manejar solicitudes RESTful. Heredan de ControllerBase y no están acoplados a vistas.

[ApiController]
[Route("api/[controller]")]
public class ProductosController : ControllerBase
{
    [HttpGet]
    public ActionResult<IEnumerable<string>> ObtenerProductos()
    {
        return Ok(new[] { "Producto1", "Producto2" });
    }

    [HttpPost]
    public IActionResult CrearProducto([FromBody] Producto producto)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }
        return CreatedAtAction(nameof(ObtenerProducto), new { id = producto.Id }, producto);
    }

    [HttpGet("{id}")]
    public ActionResult<Producto> ObtenerProducto(int id)
    {
        var producto = new Producto { Id = id, Nombre = "Producto1" };
        return producto;
    }
}

Controladores MVC

Los controladores MVC son para aplicaciones web que renderizan vistas HTML. Heredan de Controller, que extiende ControllerBase añadiendo funcionalidades específicas de vistas.

public class HomeController : Controller
{
    public IActionResult Index()
    {
        ViewData["Mensaje"] = "Bienvenido al curso de ASP.NET Core";
        return View();
    }

    public IActionResult Error()
    {
        return View("Error");
    }
}

Los controladores API son más comunes en aplicaciones modernas que devuelven datos.

Por el contrario los Controladores MVC son para proyectos MVC (lógicio) que en la actualidad están algo en desuso.

Habilitación de controladores en ASP.NET Core

Para usar controladores en una aplicación, debemos asegurarnos de que están habilitados en el pipeline de ASP.NET durante la configuración de la aplicación.

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

// Agregamos servicios para controladores
builder.Services.AddControllers();

app.UseRouting();

// Agregamos el middleware de mapeo de controladores
app.MapControllers();

app.Run();

Detección de controladores

ASP.NET detecta automáticamente los controladores. No hace falta que los agreguemos a mano, simplemente tenemos que crearlos.

Para que la autodetección funcione, debemos crear los controladores en base a una serie de reglas,

  • Como hemos dicho, las clases deben heredar de ControllerBase (o Controller).
  • El nombre del controlador debe terminar con el sufijo Controller (por ejemplo, ProductosController).
[ApiController]
public class ProductosController : ControllerBase
{
    // ... resto de código
}

Para controladores de API, además es recomendable decorarlos con [ApiController].

Esto habilita validaciones automáticas y comportamiento mejorado para APIs REST (es decir, que no es obligatorio, pero hacerlo 😉).