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 了。我知道的答案比我要求的要多,但我只是添加了此信息以进行澄清,我希望其他人可以从中受益。
这次我正在开发一个小型 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 了。我知道的答案比我要求的要多,但我只是添加了此信息以进行澄清,我希望其他人可以从中受益。