繁体   English   中英

模型联编程序无法处理double.MAX字符串表示形式返回double

[英]Model binder can't handle double.MAX string representation back to double

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

当发布备份值时,绑定会静默失败。 我必须在这行上设置一个断点:

if(ModelState.IsValid)

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

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

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

1.79769313486232E+308

正确表示double.MAX常数。

我在2005年1月 (差不多9年前)找到了Scott Hanselman的这篇帖子,内容涉及以下内容:

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

我的应用程序配置是否存在问题,或者不支持这种从string直接转换为double直接转换? 认为它应该正确处理。

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

1.79769313486231E+308

并再次进行回发,只是为了查找模型联编程序这次是否正确处理了它。

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

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

R代表“往返”。 MSDN

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

所以我这样做:

@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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM