8

一部のモデルでは、ユーザー関連の情報を含める必要があるサブモデル クラス (UserInfo) を使用しています。このサブモデルは、さまざまなモデルで使用できます。たとえば、

public class Model
{
     int string Value { get; set; }
     public UserInfo User { get; set; }
}

モデル バインダーを作成し、WebApiConfig に登録しました

config.BindParameter(typeof(UserInfo), new UserModelBinder());

問題は、UserModelBinder が WebApi 処理パイプラインによって呼び出されないことです。これらのモデルバインダーはサブモデルに対して呼び出されていないようです。何か不足していますか?

4

2 に答える 2

1

HttpConfigurationExtensions.BindParameterメソッドは、モデル バインダーを使用して Action の特定のパラメーター タイプがバインドされることを登録します。

あなたがしたことは次のようになります:

void Action([ModelBinder(UserModelBinder)] UserInfo info)

アクション パラメーターが指定された型 (UserInfo) の場合にのみ機能します。

グローバルになるように、 UserInfo クラス自体にモデル バインダー宣言を配置してみてください。

[ModelBinder(UserModelBinder)] public class UserInfo { }

ただし、WebAPI と MVC がパラメーターをバインドする方法にはいくつかの違いがあります。こちらがMike Stallさんの詳しい説明です。

于 2013-02-04T16:28:01.620 に答える
1

この質問を見てみましょうASP.net Web API の MVC の DefaultModelBinder に相当するものは何ですか? バインディングが発生する場所の詳細については、 を参照してください。

あなたModelがメッセージ本文に渡されていると思いますか?

その場合、WebApi はフォーマッターを使用して型を逆シリアル化し、モデルを処理します。デフォルトはXmlMediaTypeFormatterJsonMediaTypeFormatterまたはFormUrlEncodedMediaTypeFormatterです。

本文にモデルを投稿する場合、要求または承認されたコンテンツ タイプ (application/xml、application/json など) に応じて、シリアライザーの設定をカスタマイズするか、独自の をラップまたは実装する必要がありますMediaTypeFormatter

application/json を使用している場合JsonConvertersは、UserInfo クラスのシリアル化をカスタマイズするために使用できます。Web API ModelBinders - オブジェクトの 1 つのプロパティを別の方法でバインドする方法と、 WebApi Json.NET カスタム日付処理の例がここにあります。

internal class UserInfoConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeOf(UserInfo);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue,
                                JsonSerializer serializer)
    {
        //
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        //
    }
}
于 2013-02-07T09:31:57.293 に答える