2009-09-28 19 views

risposta

25

Crea un modelbinder, ignorare BindModel, verificare il tipo e fare ciò che devi fare

public class MyModelBinder 
    : DefaultModelBinder { 

    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { 

     if (HasGenericTypeBase(bindingContext.ModelType, typeof(MyType<>)) { 
      // do your thing 
     } 
     return base.BindModel(controllerContext, bindingContext); 
    } 
} 

impostare il proprio legante modello predefinito nella global.asax

protected void Application_Start() { 

     // Model Binder for My Type 
     ModelBinders.Binders.DefaultBinder = new MyModelBinder(); 
    } 

controlli per la corrispondenza di base generico

private bool HasGenericTypeBase(Type type, Type genericType) 
    { 
     while (type != typeof(object)) 
     { 
      if (type.IsGenericType && type.GetGenericTypeDefinition() == genericType) return true; 
      type = type.BaseType; 
     } 

     return false; 
    } 
+16

Poiché questa domanda è ancora ai primi posti nei risultati di google, vorrei dire che forse una soluzione migliore che è venuta fuori con MVC3 è quella di utilizzare [Model Binder Providers] (http://bradwilson.typepad.com/ blog/2010/10/service-location-PT9-model-binders.html). Questo rende così che non devi sostituire il raccoglitore predefinito se tutto ciò che stai facendo è provare ad aggiungere regole speciali per l'associazione di un tipo _particular_, il che rende il binding del modello personalizzato molto più scalabile. –

+0

Non riuscivo a trovare come impostare il raccoglitore modello personalizzato per tutti i tipi nell'applicazione mvc 2. Ed ecco la soluzione! Molte grazie! – blazkovicz

Problemi correlati