2009-09-28 16 views

Respuesta

25

Crear una modelbinder, anular bindModel, comprobar el tipo y hacer lo que tiene que hacer

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); 
    } 
} 

Indica tu carpeta de modelo a los valores predeterminados en el Global.asax

protected void Application_Start() { 

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

cheques para búsqueda de base genérica

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

Dado que esta pregunta sigue siendo bastante alta en los resultados de Google, me gustaría mencionar que tal vez una mejor solución que ha salido con MVC3 es utilizar [Model Binder Providers] (http://bradwilson.typepad.com/ blog/2010/10/service-location-pt9-model-binders.html). Esto hace que no tenga que reemplazar el cuaderno predeterminado si todo lo que está haciendo es tratar de agregar reglas especiales para vincular un tipo _particular_, lo que hace que el enlace del modelo personalizado sea mucho más escalable. –

+0

Estaba luchando por encontrar cómo configurar el encuadernador de modelo personalizado para todos los tipos en la aplicación mvc 2. ¡Y aquí está la solución! ¡Muchas gracias! – blazkovicz

Cuestiones relacionadas