2

现在我有一个带有属性的 ViewModel double Maximum。在视图方面,它被保存在一个隐藏的输入中,以帮助进行不显眼的验证。

发布支持值时,绑定会静默失败。我不得不在这一行上放一个断点:

if(ModelState.IsValid)

并检查哪个ModelState属性有错误。然后我发现这个double Maximum属性有以下错误消息:

从类型“System.String”到类型“System.Double”的参数转换失败。有关更多信息,请参阅内部异常。

HTML使用Firebug检查的视图中,我可以看到隐藏的输入具有以下值:

1.79769313486232E+308

正确地表示double.MAX常数。

我从2005 年 1 月(大约 9 年前)发现了这篇 Scott Hanselman 的帖子,其中涉及类似的内容:

为什么在使用 Double.Parse 时不能 Double.Parse(Double.MaxValue.ToString()) 或 System.OverloadExceptions

我的应用程序配置有问题还是不支持这种直接从stringback to的转换?double认为它应该没有错误地处理它。

注意:我尝试使用 Firebug 更改隐藏的输入值,并按照 Scott 在他的帖子中提到的那样做:我从最后一位数字中减去 1...

1.79769313486231E+308

并再次回发只是为了发现模型绑定器这次正确处理了它。

4

1 回答 1

2

@Html.HiddenFor用来创建隐藏的输入。

在仔细阅读 Scott 的帖子后,我看到他提到了往返说明符。我还在StackOverflow 上找到了一个示例。

R代表“往返”。来自MSDN

仅 Single 和 Double 类型支持此格式。往返说明符保证转换为字符串的数值将被解析回相同的数值。

所以我这样做了:

@Html.HiddenFor(m => m.Maximum,
                new { Value = Model.Maximum.ToString("R") })

现在,这给了我一个double.MAX字符串表示形式,可以double在控制器端返回到 a :

1.7976931348623157E+308

很好...问题解决了。

希望它可以帮助将来可能面临同样问题的任何人。


这有多有趣?!

1.79769313486232E+308   // double.MAX
1.7976931348623157E+308 // double.MAX.ToString("R")

值得一提的是,这一切也适用于double.MIN.

于 2013-08-31T23:43:13.797 回答