Como você usa as novas classes ModelBinder no ASP.NET MVC Preview 5
-
09-06-2019 - |
Pergunta
Você notará que o Preview 5 inclui o seguinte em suas notas de lançamento:
Adicionado suporte para vinculadores de modelo personalizados.Os fichários personalizados permitem definir tipos complexos como parâmetros para um método de ação.Para usar este recurso, marque o tipo complexo ou a declaração do parâmetro com [ModelBinder(…)].
Então, como você realmente usa esse recurso para que eu possa ter algo assim funcionando em meu controlador:
public ActionResult Insert(Contact contact)
{
if (this.ViewData.ModelState.IsValid)
{
this.contactService.SaveContact(contact);
return this.RedirectToAction("Details", new { id = contact.ID}
}
}
Outras dicas
Bem, eu investiguei isso.ASP.NET fornece um local comum para registrar a implementação de IControlBinders.Eles também têm o básico para funcionar por meio do novo método Controller.UpdateModel.
Então, basicamente combinei esses dois conceitos criando uma implementação de IModelBinder que faz a mesma coisa que Controller.UpdateModel para todas as propriedades públicas de modelClass.
public class ModelBinder : IModelBinder
{
public object GetValue(ControllerContext controllerContext, string modelName, Type modelType, ModelStateDictionary modelState)
{
object model = Activator.CreateInstance(modelType);
PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(model);
foreach (PropertyDescriptor descriptor in properties)
{
string key = modelName + "." + descriptor.Name;
object value = ModelBinders.GetBinder(descriptor.PropertyType).GetValue(controllerContext, key, descriptor.PropertyType, modelState);
if (value != null)
{
try
{
descriptor.SetValue(model, value);
continue;
}
catch
{
string errorMessage = String.Format("The value '{0}' is invalid for property '{1}'.", value, key);
string attemptedValue = Convert.ToString(value);
modelState.AddModelError(key, attemptedValue, errorMessage);
}
}
}
return model;
}
}
No seu Global.asax.cs você precisaria adicionar algo assim:
protected void Application_Start()
{
ModelBinders.Binders.Add(typeof(Contact), new ModelBinder());