Comment utiliser les nouvelles classes ModelBinder dans ASP.NET MVC Preview 5

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

  •  09-06-2019
  •  | 
  •  

Question

Vous remarquerez que l'aperçu 5 inclut les éléments suivants dans leurs notes de version :

Ajout de la prise en charge des classeurs de modèles personnalisés.Les classeurs personnalisés vous permettent de définir des types complexes comme paramètres d'une méthode d'action.Pour utiliser cette fonctionnalité, marquez le type complexe ou la déclaration de paramètre avec [ModelBinder(…)].

Alors, comment allez-vous réellement utiliser cette fonctionnalité pour que je puisse avoir quelque chose comme ceci dans mon contrôleur :

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

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

Autres conseils

Eh bien, j'ai regardé ça.ASP.NET fournit un emplacement commun pour enregistrer l’implémentation de IControlBinders.Ils disposent également des bases de ce fonctionnement via la nouvelle méthode Controller.UpdateModel.

J'ai donc essentiellement combiné ces deux concepts en créant une implémentation de IModelBinder qui fait la même chose que Controller.UpdateModel pour toutes les propriétés publiques 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;
    }
}

Dans votre Global.asax.cs, vous devrez ajouter quelque chose comme ceci :

    protected void Application_Start()
    {
        ModelBinders.Binders.Add(typeof(Contact), new ModelBinder());
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top