【问题标题】:ASP.NET MVC ViewModel binded decimal empty when using floating point numbers使用浮点数时,ASP.NET MVC ViewModel 绑定十进制为空
【发布时间】:2012-05-18 18:21:03
【问题描述】:

我创建了一个 ViewModel 对象,它有一个包含价格的小数字段。当我将它发布到我的控制器时,会发生这种情况:

  • 输入“15” -> 好!控制器收到 15 个。
  • 输入“15.00” -> 不行!控制器收到一个“空”字段。
  • 输入“15,00” -> 验证错误,因为该字段应使用句点进行格式化(我暂时只使用一种格式化类型以避免复杂性)。
  • 输入“15.00M” -> 验证错误,可能是因为它不是数字。

我该如何解决这个问题?我希望“15.00”是一个正确的值,但我不知道如何做到这一点。我尝试了几个在互联网上找到的自定义模型绑定器,但它们不起作用。

【问题讨论】:

  • 您是否有理由要使用小数而不是双精度数?
  • 嗯,这是一个“金钱”价值。我学会了总是使用小数来表示货币价值。
  • 值“15.00”不是有效的小数,但“15.00M”是有效的小数。试试看,十进制测试 = 15.00;将显示错误。您使用的模型绑定器可能没有转换它。现在,如果你做了 decimal.parse("15.00") 它应该可以工作。
  • 没关系,因为转换是由 MVC 引擎完成的。唯一重要的是如果 MVC 引擎能够从给定的值(从查询字符串或名称/值对)构造所需的模型。
  • 显示您的视图模型和您的操作方法。

标签: c# asp.net-mvc model-view-controller model-binding


【解决方案1】:

解决此问题的最简单方法是将语言固定在 web.config 文件中:

<globalization culture="en-us" uiCulture="en-us" />

你必须把这个放在&lt;system.web&gt;节点中。

为什么最简单?这样,包含的 JavaScript 帮助程序可以毫无问题地进行验证(这是通过假设数字应该是美国格式的值来完成的),现在(由于我们的更改)在服务器上是相同的。因此,在客户端有效的内容在服务器端也有效(声明仅对简单情况和启用 JavaScript 的浏览器有效)。

所有其他选项都涉及更多关于 MVC 3 中本地化的编辑、扩展和知识。

【讨论】:

  • 嗯,这很容易。谢谢!
  • 一句话——uiCulture 和culture 是有区别的(当然!:D)。如果您仍然需要支持不同的语言,您可以将 uiCulture 设置为 auto,即culture="en-us" uiCulture="auto"。这样您就可以拥有自定义 UI 字符串(本地化),但仍然拥有(美国)英文格式的数字等。
【解决方案2】:

创建一个未映射的字符串类型字段,如下所示

[NotMapped]
public string priceComputed {get;set}

然后在您的控制器中,您在右侧字段中设置值

price = convert.todecimal(pricecomputed)

【讨论】:

  • 这不是一个真正的解决方案,当您使用字符串而不是浮点数时,验证无法正常工作
猜你喜欢
  • 2023-03-25
  • 2013-07-16
  • 2014-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多