¿Cómo se utilizan las nuevas clases de ModelBinder en ASP.NET MVC Preview 5?

StackOverflow https://stackoverflow.com/questions/34709

  •  09-06-2019
  •  | 
  •  

Pregunta

Notarás que la Vista previa 5 incluye lo siguiente en sus notas de la versión:

Se agregó soporte para carpetas de modelos personalizados.Los carpetas personalizados le permiten definir tipos complejos como parámetros de un método de acción.Para utilizar esta función, marque el tipo complejo o la declaración del parámetro con [ModelBinder(...)].

Entonces, ¿cómo se puede utilizar esta función para que pueda hacer que algo como esto funcione en mi controlador?

public ActionResult Insert(Contact contact)
{
    if (this.ViewData.ModelState.IsValid)
    {
        this.contactService.SaveContact(contact);

        return this.RedirectToAction("Details", new { id = contact.ID}
    }
}

Otros consejos

Bueno, investigué esto.ASP.NET proporciona una ubicación común para registrar la implementación de IControlBinders.También tienen los conceptos básicos de este funcionamiento a través del nuevo método Controller.UpdateModel.

Básicamente, combiné estos dos conceptos creando una implementación de IModelBinder que hace lo mismo que Controller.UpdateModel para todas las propiedades 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;
    }
}

En su Global.asax.cs necesitaría agregar algo como esto:

    protected void Application_Start()
    {
        ModelBinders.Binders.Add(typeof(Contact), new ModelBinder());
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top