2

現在、プロパティを持つ ViewModel がありますdouble Maximum。ビュー側では、目立たない検証を支​​援するために隠し入力に保持されます。

値をポストバッキングすると、バインディングはサイレントに失敗します。この行にブレークポイントを配置する必要がありました。

if(ModelState.IsValid)

ModelStateどのプロパティにエラーがあったかを確認します。次に、このdouble Maximumプロパティに次のメッセージが表示されたエラーがあることがわかりました。

型 'System.String' から型 'System.Double' へのパラメーターの変換に失敗しました。詳細については、内部例外を参照してください。

ビュー側HTMLFirebugを調べていると、非表示の入力に次の値があることがわかります。

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

今回はモデルバインダーが正しく処理されていることを確認するためだけに、再度ポストバックを実行しました。

4

1 に答える 1

2

@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ください。

于 2013-08-31T23:43:13.797 に答える