2010-04-15 6 views
2

J'ai un scénario dans lequel je dois me lier à une interface - pour créer le type correct, j'ai un classeur de modèle personnalisé qui sait comment créer le bon type de béton (qui peut différer). Cependant, le type créé n'a jamais les champs correctement remplis. Je sais que quelque chose me manque ici, mais quelqu'un peut-il me dire pourquoi ou du moins ce que je dois faire pour que le classeur puisse continuer? travailler et lier les propriétés?ModelBinders, Interfaces et types imbriqués complexes

public class ProductModelBinder : DefaultModelBinder 
{ 
    override public object BindModel (ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     if (bindingContext.ModelType == typeof (IProduct)) 
     { 
      var content = GetProduct (bindingContext); 

      return content; 
     } 

     var result = base.BindModel (controllerContext, bindingContext); 

     return result; 
    } 

    IProduct GetProduct (ModelBindingContext bindingContext) 
    { 
     var idProvider = bindingContext.ValueProvider.GetValue ("Id"); 
     var id = (Guid)idProvider.ConvertTo (typeof (Guid)); 

     var repository = RepositoryFactory.GetRepository<IProductRepository>(); 
     var product = repository.Get (id); 

     return product; 
    } 
} 

Le modèle dans mon cas est un type complexe qui a une propriété IProduct, et ce sont ces valeurs que je besoin Remplit

Modèle:.

[ProductBinder] 
public class Edit : IProductModel 
{ 
    public Guid Id { get; set; } 
    public byte[] Version { get; set; } 

    public IProduct Product { get; set; } 
} 

Répondre

0

ModelBinder travaille récursive si ce vous devez faire est d'implémenter un classeur de modèle personnalisé, surcharger la méthode onCreate et BindModel dedans.

protected override object CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType) 
{ 
// get actual type of a model you want to create here 
    return Activator.CreateInstance(type); 
} 

public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
{ 
    // here our CreateModel method will be called 
    var model = base.BindModel(controllerContext, bindingContext); 
    // we will get actual metadata for type we created in the previous line 
    var metadataForItem = ModelMetadataProviders.Current.GetMetadataForType(() => model, model.GetType()); 
    // and then we need to create another binding context and start model binding once again for created object 
    var newModelBindingContext = new ModelBindingContext 
     { 
      ModelName = bindingContext.ModelName, 
      ModelMetadata = metadataForItem, 
      ModelState = bindingContext.ModelState, 
      PropertyFilter = bindingContext.PropertyFilter, 
      ValueProvider = bindingContext.ValueProvider 
     }; 
     return base.BindModel(controllerContext, newModelBindingContext); 

}

Espoir qui aide.

Questions connexes