This article has been localized into Spanish by the community.
Model Binding
La comunicación entre un cliente (usualmente un explorador) y un servidor web es muy simple - cadenas son transmitidas de ida y vuelta porque el cliente no tiene ningún entendimiento de tus objetos .NET. Por lo tanto, en los viejos tiempos de ASP Classic y ASP.NET WebForms, antes de que el framework MVC se introdujera en el framework .NET, el proceso de actualización de un Modelo era un poco engorroso. Primero, tú tenías y crear un formulario con todos los campos que el usuario pudiera cambiar. Cuando este formulario era posteado de regreso al servidor, tú tenías que leer cada uno de los campos del formulario y asignarlos a tu Modelo. Si nosotros tomamos este camino y lo usamos en ASP.NET MVC, se vería algo como esto:
<form method="post" action="/ModelBinding/UpdateFromOldSchoolForm">
<input type="text" name="txtFirstName" value="@Model.FirstName" />
<input type="text" name="txtLastName" value="@Model.LastName" />
<input type="submit" value="Update" />
</form>
public IActionResult UpdateFromOldSchoolForm()
{
WebUser webUser = LoadUserFromDatabase();
webUser.FirstName = Request.Form["txtFirstName"];
webUser.LastName = Request.Form["txtLastName"];
UpdateUserInDatabase(webUser);
return Content("User updated!");
}
Un formulario manualmente construido, el cual enviará (POST) los valores a un método, que luego leerá los valores y los asignará a un objeto. Todo muy básico y de la vieja escuela. Sin embargo, con ASP.NET MVC, se introdujo el concepto de Model Binding. Éste le permite a tus Vistas usar la información del Modelo para generar por ejemplo un formulario para editar el Modelo, pero aún más útil, le permite al método receptor en el Controlador tratar los valores posteados como un objeto del tipo del Modelo, en vez de forzarte a leer cadenas del formulario. En otras palabras, puedes seguir trabajando con objetos a lo largo de toda la comunicación entre el servidor y el cliente, gracias a la magia del Model Binding. ¡Veamos cómo funciona esto!
Usando Model Binding
Primero, necesitamos un modelo. Sí tú no sabes lo que es un modelo, te sugiero regresar algunos artículos atrás y leerlos. Crearemos un modelo simple para manejar información sobre un usuario:
public class WebUser
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
En nuestro Controlador, ahora pasamos una instancia de esta clase a la Vista. En una aplicación del mundo real probablemente obtendríamos un objeto WebUser de la base de datos, pero para conservar las cosas simple, solamente generaremos uno nuevo para esta demostración:
[HttpGet]
public IActionResult SimpleBinding()
{
return View(new WebUser() { FirstName = "John", LastName = "Doe" });
}
Permitiendo que nuestra Vista sepa qué tipo de Modelo puede esperar, con la directiva @model, podemos usar varios métodos de ayuda (más sobre estos los veremos más adelante) para ayudar con la generación de un formulario:
@using(var form = Html.BeginForm())
{
<div>
@Html.LabelFor(m => m.FirstName)
@Html.TextBoxFor(m => m.FirstName)
</div>
<div>
@Html.LabelFor(m => m.LastName)
@Html.TextBoxFor(m => m.LastName)
</div>
<input type="submit" value="Submit" />
}
El resultado será un formulario muy genérico, pero con etiquetas y cajas de texto designados a hospedar las propiedades de tu modelo:
Por defecto, el formulario será posteado de regreso a la misma URL que lo entregó, por lo que para controlarlo, necesitamos un método de Controlador que acepte POST para manejar el envío del formulario:
[HttpPost]
public IActionResult SimpleBinding(WebUser webUser)
{
//TODO: Update in DB here...
return Content($"User {webUser.FirstName} updated!");
}
Nota como nuestra acción de controlador toma sólo un parámetro, del mismo tipo que el modelo que pasamos a nuestra vista originalmente: La clase WebUser. Detrás de escena, ASP.NET MVC ahora procesa el formulario y asigna los valores encontrados en sus controles editables a las propiedades de la clase WebUser. ¡Esta es la magia de Model Binding!
Resumen
Gracias al Model Binding, puedes mantener las relaciones entre tus modelos y sus vistas mucho más fácil. En este artículo sólo hemos arañado la superficie - hay muchas más posibilidades con Model Binding, cómo lo descubrirás en algunos de los siguientes artículos.