2008-08-29 7 views
1

Vous remarquerez que Preview 5 comprend les éléments suivants dans leurs notes de version:Comment utiliser les nouvelles classes de ModelBinder-vous dans ASP.NET MVC Preview 5

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

Alors, comment allez-vous réellement utiliser cette facilité pour que je puisse avoir quelque chose comme ce travail 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} 
    } 
} 

Répondre

2

Eh bien, je regardai dans ce. ASP.NET fournit un emplacement commun pour l'inscription de l'implémentation de IControlBinders. Ils ont également les bases de ce travail 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 la classe 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 auriez besoin d'ajouter quelque chose comme ceci:

protected void Application_Start() 
    { 
     ModelBinders.Binders.Add(typeof(Contact), new ModelBinder()); 
Questions connexes