Il mio sito web ha un modulo con un numero di input che accetta numeri decimali. Questo viene inviato al controller in un modello viewmodel. Al termine della convalida, viewModel viene convertito in un'entità come questa:
quotation.WidthMeters = model.WidthMeters.
Quindi qui è dove inizia il divertimento.
Il mio sito web è nella cultura olandese. Usiamo la virgola per separatori decimali. Quindi l'utente inserisce 2,40 nel modulo. Questo viene inviato indietro. Vedo che i dati nel viewmodel contengono 2.40 che è il modo americano di dire 2,40. Ora quando questo valore viene assegnato all'entità, tutto a un tratto cambia a 240. Quindi quotation.WidthMeters
ora è 240, ma la proprietà che lo assegna ( model.WithMeters
) è 2.40.
Perché?
(probabilmente importante aggiungere: ho fatto girare il mio controller in InvariantCulture aggiungendo le seguenti due linee al costruttore del controller:
Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
Thread.CurrentThread.CurrentUICulture = CultureInfo.InvariantCulture;
L'entità è nello stesso progetto)
aggiornare
Quando aggiungo quanto segue al mio startup.cs
, funziona:
app.UseRequestLocalization(new RequestLocalizationOptions
{
DefaultRequestCulture = new RequestCulture("en-US"),
SupportedCultures = new [] {new CultureInfo("en-US") },
SupportedUICultures = new [] { new CultureInfo("en-US") }
});
Non funziona quando cambio la cultura in nl-NL , tuttavia preferisco usare la cultura olandese poiché aggiusterò anche le date.
aggiornamento 2
Nella mia forma ho usato il campo <input type="number" />
che almeno in Chrome e Firefox inviano sempre il numero indietro con un punto decimale. Sono tornato su un campo di testo e ho cambiato le culture in nl-NL. Ora posso inserire i numeri con la virgola decimale e viene gestito correttamente dal server.
Quindi TRWTF è, perché un browser mostra una virgola nel campo del numero ma la rimanda con un punto?
Non suona corretto. Dovresti ricontrollare i tuoi tipi nel compito e anche i loro valori (ad es. Nel debugger). Non ha senso che l'assegnazione di un decimale a un altro decimale nel runtime .NET cambierà il valore.