现在我有一个带有属性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的帖子,它涉及类似的事情:
我的应用配置是否有问题,或者不支持从string
直接转换回double
?我认为它应该没有错误地处理它。
注意:我尝试使用Firebug更改隐藏的输入值,并按照Scott在帖子中提到的那样:我从最后一位数中减去1 ...
1.79769313486231E+308
再次做回发只是为了找到模型绑定器这次正确处理它。
答案 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
。