1

コントローラーにメソッドがあります:

    [HttpPost]
    public virtual JsonResult Add(AddItemModel request)

これは AJAX 呼び出しを受け取ります。JSON 要求は「AddItemModel」クラスのシリアル化されたバージョンを送信し、MVC ルーティングは、期待されるすべてのプロパティ (文字列、整数、小数などのデータ型を含む) を含む AddItemModel を作成します。

次に、これを QA サーバーにデプロイすると、動作が異なります。JSON リクエストは同一です (Fiddler でチェック) が、AddItemModel には 10 進数の 1 を除くすべてのプロパティが設定されています。これはデフォルト値であるゼロの値を持ちます。

私たちの DEV 環境と QA サーバーの間に違いは見つかりませんが、おそらく正しいものを見ていないのでしょう。

この違いの原因を誰かが示唆できますか?

Dev は Win7、QA は Win2003 サーバーで、すべて最新のパッチを実行しています。

前もって感謝します

グリフ


更新 #1

decimal 型と null 許容型の両方の decimal 型用のカスタム モデル バインダーを追加し、これにトレースを追加して、何が起こっているのかを確認できるようにしました。

値が入ってきたら、試行された値を取得しました。

var attValue = modelBindingContext.ValueProvider
    .GetValue(modelBindingContext.ModelName).AttemptedValue;

これを10進数に変換しました。また、ベースの BindModel(controller, context) が返すものもテストしました。

私たちの場合、試行された値が '5' だった場合、変換により 5 の 10 進数値が得られました。しかし、MVC コードはこれを処理できませんでした。オブジェクトとして '' が返され、コントローラー メソッドに 0 として到着します。

ただし、試行された値が「5.1」の場合、私たちと MVC コードの両方が正しく 5.1 の 10 進数を返しました。

したがって、次の場合に表示されます。

  • JSON の値: 5
  • MVC は、データ型が 10 進数である POCO のプロパティにこれをバインドしようとしますが、これは失敗します

でもいつ:

  • JSON の値: 5.1
  • MVC は、データ型が 10 進数である POCO のプロパティにこれをバインドしようとしますが、これは機能します

前述したように、これは QA サーバーでのみ発生し、DEV では発生しません。これは、マイクロソフトが既にこれを修正している可能性があることを示唆していますか? しかし、前述のように、DEV 環境と QA 環境の両方に完全にパッチが適用されているようです。

ここに何か提案はありますか?

4

1 に答える 1

0

この回答を参照してください。つまり、デフォルトのモデル バインダーは、整数を 10 進数に変換できない .net の型コンバーターを使用します。

于 2013-12-04T20:01:18.303 に答える