簡體   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