2011-01-24 12 views

Odpowiedz

9

Coś między wierszami powinien wykonać zadanie:

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

i zarejestrować w Application_Start:

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

Jakie są twoje przemyślenia na temat używania 'IModelBinder' vs' DefaultModelBinder' ? –

+1

@Josiah, moje myśli są, że z 'DefaultModelBinder' mam jeden mniej przypadku martwić się o (domyślny przypadek). Jeśli używam IModelBinder, będę musiał również zająć się przypadkiem, w którym wartość jest równa True lub False i ta sprawa jest już obsługiwana przez domyślny segregator modelu, więc jest to DRYer. –

+0

Czy muszę jednoznacznie oświadczyć, że chcę używać 'BBinder' lub czy stanie się to częścią Default? – jocull

2

Check out this link. To najwyraźniej działa w MVC2.

Można zrobić coś takiego (niesprawdzone):

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

Następnie w global.asax starcie programu dodać:

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

Dzięki za odpowiedź. Jeśli chciałbym zignorować lub przedefiniować domyślne przypadki, byłoby to rozwiązanie, którego użyłem. – jocull

Powiązane problemy