7

W moim projekcie chcę umożliwić użytkownikom wprowadzanie podwójnych wartości w 2 formatach: za pomocą "," lub "." jako ogranicznik (nie interesuje mnie forma wykładnicza). Domyślnie wartość z ogranicznikiem "." nie działają. Chcę, aby to zachowanie działało dla wszystkich podwójnych właściwości w złożonych obiektach modelu (obecnie pracuję z kolekcjami obiektów, które zawierają identyfikatory i wartości).Problem z podwójnymi wartościami wiążącymi

Co powinienem użyć: Dostawcy wartości lub spoiwa do modeli? Proszę pokazać przykład kodu rozwiązania mojego problemu.

+2

http://stackoverflow.com/questions/5050641/asp-net-mvc- model-binder-with-global-number-formats pomoc w ogóle? – iwayneo

Odpowiedz

17

Można użyć niestandardowego modelu Spoiwo:

public class DoubleModelBinder : DefaultModelBinder 
{ 
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     var result = bindingContext.ValueProvider.GetValue(bindingContext.ModelName); 
     if (result != null && !string.IsNullOrEmpty(result.AttemptedValue)) 
     { 
      if (bindingContext.ModelType == typeof(double)) 
      { 
       double temp; 
       var attempted = result.AttemptedValue.Replace(",", "."); 
       if (double.TryParse(
        attempted, 
        NumberStyles.Number, 
        CultureInfo.InvariantCulture, 
        out temp) 
       ) 
       { 
        return temp; 
       } 
      } 
     } 
     return base.BindModel(controllerContext, bindingContext); 
    } 
} 

które mogą być zarejestrowane w Application_Start:

ModelBinders.Binders.Add(typeof(double), new DoubleModelBinder()); 
+0

Dziękuję za jasną odpowiedź, ale jaki jest cel Dostawców Wartości? Czy jest to abstrakcja w różnych źródłach (np. Gromadzenie wartości formularza, parametry adresu URL, zmienne serwera, pliki cookie itp.)? –

+0

Plus, nie zapomnij dodać tego samego segregatora dla typu Nullable – vasilyk

Powiązane problemy