2017-09-04 124 views
1

我的网站有一个带有十进制数字的数字输入表单。这通过视图模型发送回控制器。当验证通过时,视图模型被转换为像这样的实体:aspnet核心/ ef核心实体的小数烦恼

quotation.WidthMeters = model.WidthMeters. 

因此,这里是有趣的开始。

我的网站是在荷兰文化。我们使用逗号作为小数分隔符。所以用户在表格中输入2,40。这被送回。我可以看到viewmodel中的数据包含2.40这是美国的说法2,40。现在当这个值被分配给实体时,它突然改变为240.因此quotation.WidthMeters现在是240,但分配它的属性(model.WithMeters)是2.40。

为什么?

(可能是重要的补充:我做了我的控制器运行在InvariantCulture的加入下面的两行到控制器的构造函数:

Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture; 
Thread.CurrentThread.CurrentUICulture = CultureInfo.InvariantCulture; 

实体是在同一个项目)

更新

当我添加下面我startup.cs,它的工作原理:

app.UseRequestLocalization(new RequestLocalizationOptions 
     { 
      DefaultRequestCulture = new RequestCulture("en-US"), 
      SupportedCultures = new [] {new CultureInfo("en-US") }, 
      SupportedUICultures = new [] { new CultureInfo("en-US") } 
     }); 

当我将文化改为nl-NL时,它不起作用,但我更喜欢使用荷兰文化,因为那样也会修复日期。

更新2

在我的表单中我使用了<input type="number" />场至少在Chrome和Firefox总是带小数点送多少回。 我切换回文本字段并将文化更改为nl-NL。现在我可以输入带有十进制逗号的数字,并由服务器正确处理。

所以TRWTF是为什么一个浏览器在数字字段中显示一个逗号,但用点回送一个逗号?

+1

所以你告诉我们,将小数点分配给另一个小数点会将数值从2.40更改为240? – user743414

+0

@ user743414请参阅我的编辑 – jao

+0

您是否安装了https://www.nuget.org/packages/Microsoft.AspNetCore.Localization/? – haim770

回答

0

这听起来不正确。你应该仔细检查你的类型以及它们的值(例如在调试器中)。在.NET运行时中将另一个十进制值指定为另一个十进制值将会改变该值,这没有任何意义。

+0

这与.NET更改类型无关。这关乎国际化 - 浏览器使用与服务器不同的文化。 ASP.NET已经处理过这个问题,除非有人对错误的文化进行硬编码,或者只是使用错误的文化。就像开发人员的机器语言环境设置为“en-US”,试图输入本地化的字符串。 –