6

ユーザーがリードの見積もりの​​リストを編集する必要があります。見積もりは次のようなさまざまなタイプにすることができます。

  • 製品タイプ A の見積もり
  • 製品タイプ B の見積もり

すべての見積もりタイプは、QuoteBase などの共通の基本クラスを共有します。

私の見積もりはフロントエンドに正しく表示されており、正しいデータもポストバックされているようです。

ただし、サーバーでは、使用するサブクラスが明らかにわからないため、基本クラスを使用するだけです。

コレクション内のオブジェクトのタイプを含むModelTypeなどの非表示フィールドをチェックするには、WebApi用のカスタムモデルバインダーが必要だと思います。モデルバインダーは、このタイプの新しいオブジェクトを作成し、投稿されたプロパティをバインドしますこのオブジェクトへの値。

ただし、この時点で、これを行う方法に関するドキュメントやブログはほとんどありません。

WebApi のソース コードをチェックして、デフォルトのモデル バインダーを拡張できるかどうかを確認しましたが、デフォルトはすべてシール クラスです。

IModelBinder は見た目だけで実装できます。ModelType という値を探すことで正しいモデル タイプを作成できますが、デフォルトがあった場合、サブクラスの残りの値をどのように入力すればよいかわかりません。 i から継承していたモデル バインダーは、基本クラスの bind メソッドを呼び出すだけです。

4

1 に答える 1

10

投稿コレクションがリクエスト本文からのものである場合、モデルバインダーを通過しません。Web APIは、フォーマッターを使用してコンテンツを逆シリアル化します。

jsonをサポートしたいだけなら、それは非常に簡単です。次のコードをWebAPI構成に追加するだけです。

config.Formatters.JsonFormatter.SerializerSettings.TypeNameHandling = Newtonsoft.Json.TypeNameHandling.Auto;

この設定により、ランタイムタイプが宣言タイプと異なる場合、json.netはペイロードにタイプ名を保存できます。ポストバックすると、json.netはペイロードをペイロードで指定したタイプに逆シリアル化します。

サンプルペイロードは次のようになります。

{"$type":"MvcApplication2.Models.Car, MvcApplication2","SeatCount":10,"WheelCount":4,"Model":0,"Brand":null}]
于 2012-10-13T08:15:27.483 に答える