2016-04-06 15 views
1

120,12 von HTTP-Anforderung wird in Doppelmodell 12012 konvertiert. Ich las, dass ASP.NET MVC solche Dinge behandeln sollte, aber ich konnte es nichtKomma-Dezimaltrennzeichen wird von ASP.NET MVC-Modellbinder ignoriert

Anfrage funktioniert:

Accept-Language:da,en;q=0.8,ru;q=0.6,en-US;q=0.4 
... 
Price: "120,12" 

Aktionsmethode‘Modell enthält: public double Price { get; set; }

Innen Aktion:

var uICulture = Thread.CurrentThread.CurrentUICulture; // {da} 
var culture = Thread.CurrentThread.CurrentCulture; // {da-DK} 

Die Lokalisierung wird in Global.asax innerhalb Application_AcquireRequestState:

gesteuert 210
var cultureInfo = new CultureInfo("da"); 
Thread.CurrentThread.CurrentUICulture = cultureInfo; 
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(cultureInfo.Name); 

Vielen Dank im Voraus für jede Hilfe!

+0

'double.Parse (" 120,12 ", neues System.Globalization.CultureInfo (" da "))' gibt 120.12 zurück. Anstatt zu versuchen, das Gebietsschema mit 'AcquireRequestState' hart zu codieren, sollten Sie versuchen, herauszufinden, was falsch ist - vielleicht verwendet web.config eine bestimmte Kultur? Gibt es eine Richtlinie zur Ansicht? Der Versuch, ein Gebietsschema bei verschiedenen Einstellungen zu nageln, führt normalerweise zu mehr Verwirrung und Fehlern –

+0

Danke für Ihren Kommentar. In diesem Projekt wird AcquireRequestState verwendet, um das Gebietsschema nach den Wünschen des Benutzers einzurichten - ich habe es einfach für die Frage als fest codiertes Gebietsschema vereinfacht. –

Antwort

0

Sie können einen benutzerdefinierten Modellbinder schreiben.

public class DecimalModelBinder : IModelBinder 
    { 
     public object BindModel(ControllerContext controllerContext, 
      ModelBindingContext bindingContext) 
     { 
      var valueResult = bindingContext.ValueProvider 
       .GetValue(bindingContext.ModelName); 
      var modelState = new ModelState {Value = valueResult}; 
      object actualValue = null; 
      try 
      { 
       //Check if this is a nullable decimal and a null or empty string has been passed 
       var isNullableAndNull = (bindingContext.ModelMetadata.IsNullableValueType && 
              string.IsNullOrEmpty(valueResult.AttemptedValue)); 

       //If not nullable and null then we should try and parse the decimal 
       if (!isNullableAndNull) 
       { 
        actualValue = decimal.Parse(valueResult.AttemptedValue, NumberStyles.Any, CultureInfo.CurrentCulture); 
       } 
      } 
      catch (FormatException e) 
      { 
       modelState.Errors.Add(e); 
      } 

      bindingContext.ModelState.Add(bindingContext.ModelName, modelState); 
      return actualValue; 
     } 
    } 
} 

Ändern Sie einfach die CultureInfo.CurrentCulture zu der der einen der Benutzer in der Decimal.Parse Anweisung ausgewählt hat. Dann registrieren Sie den neuen Modellbinder beim Start.