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/5pasará5como 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=2pasaráASP.NETcomoqueryy2comopage.
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=2pasará5comocategoryId,ASP.NETcomoquery, y2comopage.
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.