Parámetros controladores
En ASP.NET MVC, puedes pasar parámetros a los controladores de varias maneras. Aquí te explico los métodos más comunes para hacerlo, con ejemplos:
1. Parámetros en la URL (Route Parameters)
Este método se basa en definir rutas que incluyen valores de parámetros. Se utilizan principalmente en métodos de acción que se ajustan a un patrón de ruta específico.
Ejemplo:
Supongamos que tienes una ruta en tu archivo de configuración Startup.cs
o Program.cs
que define una plantilla de ruta como esta:
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
En esta ruta, {id?}
es un parámetro opcional en la URL. Se puede pasar en la URL como se muestra a continuación.
Controlador:
public class ProductController : Controller
{
public IActionResult Details(int id)
{
// El parámetro "id" es obtenido de la URL
var product = ProductRepository.GetProductById(id);
if (product == null)
{
return NotFound();
}
return View(product);
}
}
URL:
/Product/Details/5
pasará5
como valor para el parámetroid
.
2. Parámetros de Cadena de Consulta (Query String)
Este método pasa los parámetros en la URL después de un signo de interrogación (?
). Los parámetros son pares clave-valor y se obtienen en el controlador como parámetros del método de acción.
Ejemplo:
Controlador:
public class SearchController : Controller
{
public IActionResult Results(string query, int page = 1)
{
// query y page se obtienen de la cadena de consulta
var results = SearchService.Search(query, page);
return View(results);
}
}
URL:
/Search/Results?query=ASP.NET&page=2
pasaráASP.NET
comoquery
y2
comopage
.
ASP.NET enlaza automáticamente los parámetros de la cadena de consulta a los parámetros de la acción en el controlador si los nombres coinciden.
3. Envío de Datos en el Cuerpo de la Solicitud (Form Data o JSON)
En los métodos POST
, PUT
o DELETE
, los parámetros suelen pasarse en el cuerpo de la solicitud en formato JSON o como datos de formulario. Esto es útil cuando se envían grandes cantidades de datos.
Ejemplo de Datos de Formulario (Form Data):
Controlador:
[HttpPost]
public IActionResult SubmitForm(string name, int age)
{
// name y age se envían en el cuerpo de la solicitud como datos de formulario
// Procesar los datos aquí
return Ok();
}
Formulario HTML:
<form method="post" action="/Home/SubmitForm">
<input type="text" name="name" />
<input type="number" name="age" />
<button type="submit">Enviar</button>
</form>
Ejemplo de Datos JSON:
Para recibir datos JSON, debes decorar el parámetro con [FromBody]
.
[HttpPost]
public IActionResult Create([FromBody] Product model)
{
if (ModelState.IsValid)
{
// Procesa el modelo
return Ok(model);
}
return BadRequest(ModelState);
}
Cliente JSON:
Para enviar JSON desde un cliente, puedes usar fetch
o HttpClient
:
fetch('/Product/Create', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ name: 'Laptop', price: 1200 })
});
4. Modelo de Datos (Model Binding)
Puedes pasar un modelo completo al controlador mediante el enlazador de modelos de ASP.NET. Esto es útil cuando el formulario tiene múltiples campos.
Ejemplo:
Supongamos que tienes una clase Product
:
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
}
Controlador:
[HttpPost]
public IActionResult Create(Product product)
{
if (ModelState.IsValid)
{
// Procesa el modelo Product
return Ok(product);
}
return BadRequest(ModelState);
}
Vista HTML:
<form method="post" action="/Product/Create">
<input type="text" name="Name" />
<input type="number" name="Price" />
<button type="submit">Crear Producto</button>
</form>
ASP.NET enlaza automáticamente el formulario HTML con la clase Product
en el controlador.
5. Parámetros de Ruta y Query en Combinación
Puedes combinar parámetros de ruta y cadena de consulta en la misma solicitud.
Controlador:
public IActionResult Search(int categoryId, string query, int page = 1)
{
// categoryId proviene de la URL
// query y page provienen de la cadena de consulta
var results = SearchService.Search(categoryId, query, page);
return View(results);
}
URL:
/Search/5?query=ASP.NET&page=2
pasará5
comocategoryId
,ASP.NET
comoquery
, y2
comopage
.
6. Usando FromQuery
, FromRoute
, FromForm
, y FromBody
ASP.NET Core permite especificar la fuente de cada parámetro explícitamente usando atributos como [FromQuery]
, [FromRoute]
, [FromForm]
, y [FromBody]
.
Ejemplo:
[HttpPost("{id}")]
public IActionResult UpdateProduct(
[FromRoute] int id,
[FromQuery] string name,
[FromForm] decimal price,
[FromBody] ProductDetails details)
{
// Aquí id viene de la ruta, name de la cadena de consulta,
// price del formulario, y details del cuerpo JSON
return Ok();
}
7. Usando TempData
y Session
para Pasar Datos entre Controladores
Ejemplo con TempData
:
TempData
permite pasar datos entre solicitudes, pero se elimina una vez que se leen.
public class HomeController : Controller
{
public IActionResult Index()
{
TempData["Message"] = "Bienvenido a la aplicación";
return RedirectToAction("Welcome");
}
public IActionResult Welcome()
{
var message = TempData["Message"];
return Content(message.ToString());
}
}
Ejemplo con Session
:
Session
permite almacenar datos en la sesión del usuario.
public class HomeController : Controller
{
public IActionResult SetSessionData()
{
HttpContext.Session.SetString("UserName", "John Doe");
return RedirectToAction("GetSessionData");
}
public IActionResult GetSessionData()
{
var userName = HttpContext.Session.GetString("UserName");
return Content($"UserName: {userName}");
}
}
Estas son las principales formas de pasar datos a un controlador en ASP.NET MVC. Cada método es útil en diferentes escenarios y te permite manejar tanto datos simples como complejos en aplicaciones web.