[英]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.