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;
}
fonte
2009-09-28 13:36:59
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. –
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