3

最近、MVC4ベータ版からRCに更新しましたが、WebApiプロジェクトで小さな問題が発生しました。私が最初に気づいたことの1つは、ServiceResolverが削除されたことです。削除される前は、次の方法でカスタムモデルバインダープロバイダーを登録するために使用していました。

IEnumerable<object> modelBinderProviderServices = GlobalConfiguration.Configuration.ServiceResolver.GetServices(typeof(ModelBinderProvider));
List<Object> services = new List<object>(modelBinderProviderServices) { new CustomDynamicObjectModelBinderProvider() };
GlobalConfiguration.Configuration.ServiceResolver.SetServices(typeof(ModelBinderProvider), services.ToArray());

このモデルバインダープロバイダーを利用したアクションには、次のシグネチャがあります。

[HttpPut]
public void Put(CustomDynamicObject model)

古いコードを次のコードに置き換えようとしましたが、結果がありませんでした。

GlobalConfiguration.Configuration.Services.Add(typeof(ModelBinderProvider), new CustomDynamicObjectModelBinderProvider());

指定されたアクションにデータをPUTしようとすると、モデルプロバイダーのGetBinderメソッドが呼び出されず、モデルパラメーターがnullに設定されます。Acion /メソッドのシグネチャを次のように変更することで、ModelBinder属性を使用して目的のmodelbinderをアクションに使用させることができました。

[HttpPut]
public void Put([ModelBinder(typeof(CustomDynamicObjectModelBinderProvider))] CustomDynamicObject model)

これは機能しますが、すべてのコントローラー/アクションでこの構文を使用する必要はありません。

私のモデルバインダープロバイダーは以下から継承していることに言及する必要があると思います。

System.Web.Http.ModelBinding.ModelBinderProvider

次の名前空間に別のModelBinderProviderクラスがあることがわかったので、これを言っています。

Microsoft.Web.Mvc.ModelBinding

要約すると、MVC4 RC WebApiにカスタムmodelbinderを登録する方法は?

4

1 に答える 1

7

ベータ版以降、WebAPIのモデルバインディングルールが変更されました。新しいルールについては、MikeStallの投稿で説明されています。ModelBinder複合型のモデルバインディングは、パラメーターに属性を明示的に追加した場合にのみ機能するようになりました。

リリース候補以降、パラメータのバインドメカニズムが再び変更されたため、変更を多く行う前にRTMを待つことをお勧めします。RCバージョンで機能する可能性のある他のオプションがいくつかあります-バインドしようとしているデータのソース(クエリ文字列またはリクエスト本文)によって異なります。

  • データのソースがリクエスト本文MediaTypeFormatterである場合は、モデルバインダーではなくカスタムを作成できます。

  • データがクエリ文字列からのものであり、パラメータに属性を明示的に含めないようにしたい場合は、カスタムカスタム[ModelBinder]の組み合わせを使用できる場合があります。TypeConverterIValueProvider

HttpParameterBindingRTMバージョン(または現在のナイトリー)では、他のオプションが機能しない場合にカスタムを使用できます。

于 2012-06-08T03:27:51.093 に答える