2011-01-24 13 views

Respuesta

9

algo entre las líneas debe hacer el trabajo:

public class BBinder : DefaultModelBinder 
{ 
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); 
     if (value != null) 
     { 
      if (value.AttemptedValue == "1") 
      { 
       return true; 
      } 
      else if (value.AttemptedValue == "0") 
      { 
       return false; 
      } 
     } 
     return base.BindModel(controllerContext, bindingContext); 
    } 
} 

y registrar en Application_Start:

ModelBinders.Binders.Add(typeof(bool), new BBinder()); 
+1

¿Cuáles son sus pensamientos sobre el uso de '' IModelBinder' vs DefaultModelBinder' ? –

+1

@Josiah, mis pensamientos son que con 'DefaultModelBinder' tengo un caso menos de qué preocuparse (el caso predeterminado). Si uso IModelBinder, tendré que manejar también el caso en el que el valor sea True o False, y este caso ya lo maneja la carpeta predeterminada del modelo, por lo que es DRYer. –

+0

¿Debo declarar explícitamente que deseo utilizar 'BBinder' o será como parte del valor predeterminado? – jocull

2

Salida this link. Al parecer funciona en MVC2.

Se podría hacer algo así (no probado):

public class BooleanModelBinder : IModelBinder { 
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) { 
     ValueProviderResult value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); 
     // do checks here to parse boolean 
     return (bool)value.AttemptedValue; 
    } 
} 

Luego, en el Global.asax al iniciar la aplicación añadir:

ModelBinders.Binders.Add(typeof(bool), new BooleanModelBinder()); 
+0

Gracias por la respuesta. Si quisiera ignorar o redefinir los casos predeterminados, esta sería la solución que utilicé. – jocull

Cuestiones relacionadas