MVC FormCollection 值解析为带有小数句点分隔符的小数

MVC FormCollection value parse to decimal with period seperator for decimals

这次我正在开发一个小型 MVC 应用程序。在控制器中我的模型的更新部分,所有字段值都在控制器中传递。其中一个字段是十进制值。该值使用句点作为分隔符存储在数据库中。该字段名为 ContractHours。 40 存储为 40.00。现在,当检索数据时,由于我浏览器的语言设置(顺便说一句,这很好),表单中的值显示为 40,00。但是当我尝试更新时,传递给 formcollection 的这个值当然也是 40,00。但是当我尝试执行更新语句时

update Employee set ContractHours = collection["ContractHours"] WHERE ID = 1

我遇到异常,因为数据库不接受 40,00 作为十进制值传递。所以我尝试使用以下方法将该值解析为小数:

var ch = Decimal.Parse(collection["ContractHours"],CultureInfo.InvariantCulture)

甚至

var ch = Decimal.Parse(collection["ContractHours"], NumberStyles.Any, new CultureInfo("en-US"))

但是这两个语句 return 值 40,00 为 4000。

使用简单的替换可以解决问题,但感觉不对

var ch = collection["ContractHours"].Replace(",",".");

我已经在这个论坛上搜索并用谷歌搜索了解决方案,但我找不到任何解决方案。那么在不更改浏览器语言设置的情况下解决问题的正确方法是什么?

今天我联系了一位帮助我解决这个问题的人。

原来我用的时候:

var ch = Decimal.Parse(collection["ContractHours"], NumberStyles.Any,new CultureInfo("nl-NL"));

给我 ch var 的正确值,在本例中为 40.00。

然而,另一个问题出现了,这不是原始问题的一部分,但我想我还是会分享它。

我在 query-string 中使用了 ch 变量,如下所示:

string sqlQuery = $"update Employee set Name ='{collection["name"]}' , Email = ' {collection["email"]}'," +
                    $"ContractHours={ch},IsActive={(collection["IsActive"].ToString().Contains("true") ? 1 : 0)} " +
                    $"WHERE ID={id}";

当我试图执行这个字符串时,抛出了一个异常。事实证明,在 query-string 中使用时,ch 的值再次为 40,00。有人告诉我这是由 var ch 转换为字符串引起的,当发生这种情况时,将使用用作设置文化的值。在这种情况下,nl-NL 导致 ch 的值在 SQL-query.

中用于字符串时变回 40,00

所以我们所做的是在 Applicaiton_OnStart()

中的 MVC .NET Framework 应用程序的 global.asx.cs 中添加了下一行
 CultureInfo.CurrentUICulture = CultureInfo.InvariantCulture;
 CultureInfo.CurrentCulture = CultureInfo.InvariantCulture;
 CultureInfo.DefaultThreadCurrentCulture = CultureInfo.InvariantCulture;
 CultureInfo.DefaultThreadCurrentUICulture = CultureInfo.InvariantCulture;

然后将 sql-query 更改为:

string sqlQuery = $"update Employee set Name ='{collection["name"]}' , Email = ' {collection["email"]}'," +
                    $"ContractHours={collection["ContractHours"]},IsActive={(collection["IsActive"].ToString().Contains("true") ? 1 : 0)} " +
                    $"WHERE ID={id}";

不再需要 var ch 了。我知道的答案比我要求的要多,但我只是添加了此信息以进行澄清,我希望其他人可以从中受益。