2011-01-24 7 views

risposta

9

Qualcosa tra le righe dovrebbe fare il lavoro:

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

e registrare in Application_Start:

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

Quali sono i tuoi pensieri sul usando '' IModelBinder' vs DefaultModelBinder' ? –

+1

@Josiah, i miei pensieri sono che con 'DefaultModelBinder' ho un caso in meno di cui preoccuparmi (il caso predefinito). Se utilizzo IModelBinder dovrò anche gestire il caso in cui il valore è uguale a True o False e questo caso è già gestito dal modello predefinito, quindi è DRYer. –

+0

Devo dichiarare esplicitamente che desidero utilizzare 'BBinder' o accadrà come parte del Default? – jocull

2

Partenza this link. Apparentemente funziona in MVC2.

Si potrebbe fare qualcosa di simile (non testata):

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

Poi nel global.asax su richiesta Iniziamo aggiungere:

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

Grazie per la risposta. Se volessi ignorare o ridefinire i casi predefiniti, questa sarebbe la soluzione che ho usato. – jocull

Problemi correlati