模型绑定器无法处理double.MAX字符串表示形式返回double

时间:2013-08-31 23:15:52

标签: asp.net-mvc string type-conversion double modelbinder

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

在后备值时,绑定会无声地失败。我不得不在这一行上设置一个断点:

if(ModelState.IsValid)

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

  

从类型'System.String'到类型的参数转换   'System.Double'失败了。请参阅内部异常了解更多信息   信息。

在视图一侧检查HTML Firebug我可以看到隐藏的输入具有此值:

1.79769313486232E+308

正确表示double.MAX常量。

我在 2005年1月(差不多9年前)发现了这个Scott Hanselman的帖子,它涉及类似的事情:

Why you can't Double.Parse(Double.MaxValue.ToString()) or System.OverloadExceptions when using Double.Parse

我的应用配置是否有问题,或者不支持从string直接转换回double?我认为它应该没有错误地处理它。

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

1.79769313486231E+308

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

1 个答案:

答案 0 :(得分:1)

我正在使用@Html.HiddenFor来创建隐藏的输入。

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

  

R代表“往返”。来自MSDN

     

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

所以我这样做了:

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

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

1.7976931348623157E+308

很好......问题解决了。

希望将来有可能面临同样问题的人帮助。


这有多有趣?!

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

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