Los métodos de acción pueden recibir parámetros que podemos pasarle desde la solicitud HTTP (en distintas fuentes).
Por ejemplo, los valores pueden venir de la URL, los parámetros de consulta, o el cuerpo de la solicitud.
Para convertir los datos de la solicitud en los parámetros, ASP.NET utiliza un proceso llamado model binding, que hace todo el trabajo sin tener que preocuparnos por nosotros.
- Identifica las fuentes disponibles (query string, route data, body)
- Convierte los datos al tipo requerido
- Asigna los valores a los parámetros
Esta asignación es automática, lo que nos simplifica mucho el manejo de datos y nos evita tener que escribir código repetitivo y la posibilidad de cometer errores.
Tipos de parámetros
Como decíamos, ASP.NET puede convertir a parámetros datos recibidos de distintas fuentes de la petición HTTP.
Tipo | Uso recomendado | Ejemplo | Atributo en ASP.NET Core |
---|---|---|---|
Ruta | IDs únicos, recursos específicos | /api/products/5 | [FromRoute] |
Consulta | Filtros, paginación, ordenación | /api/products?category=tech&page=2 | [FromQuery] |
Cuerpo | Creación/actualización (JSON/XML) | POST /api/products + JSON | [FromBody] |
Cabeceras | Autenticación, metadata | Authorization: Bearer xyz | [FromHeader] |
Formularios | Subida de archivos o datos de formulario | Content-Type: multipart/form-data | [FromForm] |
Veamos cada uno de ellos en detalle 👇,
Parámetros de ruta
Los parámetros de ruta (o route parameters) forman parte de la URL misma, lo que los hace ideales para identificar recursos únicos, como un usuario o un producto.
Por ejemplo, en /products/5
, el 5
es un parámetro de ruta que probablemente representa un ID.
En ASP.NET, definimos estos parámetros directamente en la plantilla de ruta:
[HttpGet("products/{id}")]
public IActionResult GetProduct(int id)
{
var product = _productService.GetById(id);
return Ok(product);
}
El marcador {id}
en la ruta indica que esperamos un valor numérico, que ASP.NET automáticamente convierte al tipo int
del parámetro del método.
Cuándo usar parámetros de ruta
- Identificadores únicos (como IDs de base de datos).
- Datos obligatorios para la operación.
- Estructuras jerárquicas (ej:
/departments/{deptId}/employees/{empId}
).
No uses parámetros de ruta para datos opcionales o filtros complejos, ya que ensucian la URL y dificultan su lectura
Parámetros de consulta
Los parámetros de consulta (query parameters) aparecen después del ?
en la URL y son ideales para datos opcionales, como filtros, paginación u ordenación. Por ejemplo: /products?category=electronics&page=2
.
En ASP.NET, estos parámetros se definen como argumentos del método:
[HttpGet("products")]
public IActionResult GetProducts(
[FromQuery] string category,
[FromQuery] int page = 1)
{
var filteredProducts = _productService.GetByCategory(category, page);
return Ok(filteredProducts);
}
El atributo [FromQuery]
es opcional, pero ayuda a clarificar la intención. Los parámetros pueden tener valores por defecto (como page = 1
).
Buenas prácticas con parámetros de consulta
- Usa nombres descriptivos (
category
en lugar decat
). - Evita estructuras complejas (para eso usa el cuerpo).
- Considera la paginación (
page
,pageSize
) en endpoints que devuelvan colecciones.
Parámetros de cuerpo
El cuerpo de la solicitud (request body) se usa principalmente en operaciones POST
, PUT
y PATCH
para enviar datos estructurados, como un objeto JSON. Por ejemplo, al crear un nuevo producto:
[HttpPost("products")]
public IActionResult CreateProduct([FromBody] ProductDto productDto)
{
var createdProduct = _productService.Create(productDto);
return CreatedAtAction(nameof(GetProduct), new { id = createdProduct.Id }, createdProduct);
}
El atributo [FromBody]
indica que ASP.NET debe deserializar el JSON recibido en un objeto ProductDto
.
Reglas clave para el cuerpo
- Evita enviar IDs en el cuerpo para operaciones de actualización (mejor usa rutas).
Parámetros de formularios
Los parámetros de formularios se utilizan para recibir datos enviados desde formularios HTML. Estos datos se envían en el cuerpo de la solicitud y se pueden vincular a parámetros de acción.
[HttpPost("productos/crear")]
public IActionResult Crear([FromForm] Producto producto)
{
// Lógica para crear un nuevo producto
CrearProducto(producto);
return RedirectToAction("Index");
}
Parámetros de cabeceras*
Los parámetros de cabeceras se extraen de las cabeceras HTTP. Para ello, se utiliza el atributo [FromHeader]
.
[HttpGet("productos")]
public IActionResult Listar([FromHeader(Name = "Accept-Language")] string idioma)
{
// Lógica para listar productos según el idioma
var productos = ListarProductosPorIdioma(idioma);
return View(productos);
}