Le ultime due puntate sono dedicate ai dati, in particolare al
model binding e alla validazione; il
model binding è un meccanismo che mappa le richieste dati HTTP nei parametri di un
action method.
Nel codice delle puntate precedenti è già presente un tipico utilizzo di
model binding:
public ActionResult InsertCustomer(string firstName, string lastName) {...}
Dietro le quinte il Framework MVC utilizza la classe
ControllerActionInvoker per invocare i componenti
DefaultModelBinder e
ValueProviderDictionary, i quali hanno il compito di
convertire le richieste in oggetti .NET validi per ciascun parametro passato nell'
action method.
E' anche possibile utilizzare un
custom type come parametro ed evitare di scrivere troppo codice inutile per valorizzare i membri con i parametri:
public ActionResult InsertCustomer(Customer customer) {...}
In alternativa si può invocare direttamente il
model binding, utilizzando il metodo
UpdateModel() del controller di base:
public ActionResult InsertCustomer()
{ var customer = new Customer();
UpdateModel(customer);
...
}
Se occorre, è pensabile costruire un
model binder personalizzato per particolari esigenze; gli step da seguire riguardano la registrazione, la costruzione del
model binder e l'esecuzione; ipotizzate la definizione di un
type nel file
Global.asax dell'applicazione web e per la precisione nell'
Application_Start, quindi dovete effettuarne la registrazione in questo modo:
// Classe tipo da registrare come custom model binder
public class Customer
{ public string Name { get; set; } public string Address { get; set; } public string Mobile { get; set; }}
...
...
// nel file Global.asax
protected void Application_Start()
{ ModelBinders.Binders[typeof(Customer)] = new CustomerBinder();
}
E ora passate alla costruzione del
model binder personalizzato: a tale scopo vi servirà implementare l'interfaccia
IModelBinder:
public class CustomerBinder : IModelBinder
{ public object GetValue(ControllerContext controllerContext,
string modelName, Type modelType,
ModelStateDictionary modelState)
{ Customer customer = new Customer();
customer.Name = controllerContext.
HttpContext.Request.Form["Name"];
customer.Address = controllerContext.
HttpContext.Request.Form["Address"];
customer.Mobile = controllerContext.
HttpContext.Request.Form["Mobile"];
return customer;
}
}
È così possibile vedere in azione il
model binder suddetto, basta passare come parametro la classe
Customer nell'
action method del controller che vi serve, quindi:
public ActionResult SaveCustomer(Customer customer)
{ ...
}
Ovviamente per ragioni di spazio non è tutto qui ciò che potete realizzare con il
model binding, per tale motivo vi invito a dare una occhiata ad
alcune sane letture.