6

APIを使いやすくするために、モデルバインディングを試してみました。APIを使用している場合、データが本文にある場合にのみ、モデルバインディングをバインドすることができず、クエリの一部である場合に限ります。

私が持っているコードは次のとおりです。

public class FunkyModelBinder : IModelBinder
{
    public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext)
    {
        var model = (Funky) bindingContext.Model ?? new Funky();

        var hasPrefix = bindingContext.ValueProvider
                                      .ContainsPrefix(bindingContext.ModelName);
        var searchPrefix = (hasPrefix) ? bindingContext.ModelName + "." : "";
        model.Funk = GetValue(bindingContext, searchPrefix, "Funk");
        bindingContext.Model = model;
        return true;
    }

    private string GetValue(ModelBindingContext context, string prefix, string key)
    {
        var result = context.ValueProvider.GetValue(prefix + key);
        return result == null ? null : result.AttemptedValue;
    }
}

上のValueProviderプロパティを見ると、bindingContext私は見るだけで、データが本文にある場合は取得できないことを意味すると思います。これはどのようにすればよいですか?jsonまたはフォームエンコードのいずれかとしてデータを投稿することをサポートしたいと思います。QueryStringValueProviderRouteDataValueProvider

4

1 に答える 1

3

これについても調べています。

WebApi Model Binder には、2 つのビルトイン ValueProviders が付属しています。

QueryStringValueProviderFactory & RouteDataValueProviderFactory

通話時に検索されるもの

context.ValueProvider.GetValue

この質問には、本文からデータをバインドする方法に関するコードがいくつかあります。

System.Web.Http.ModelBinding.IModelBinder から結果モデル オブジェクトを渡す方法。BindModel?

これを行うためにカスタム ValueProvider を作成することもできますが、おそらくより良いアイデアです。キーに一致する値が検索されます。上記のリンクは、モデル バインダー内でこれを行うだけであり、ModelBinder は本文のみを参照するように制限されています。

public class FormBodyValueProvider : IValueProvider
{
    private string body;

    public FormBodyValueProvider ( HttpActionContext actionContext )
    {
        if ( actionContext == null ) {
            throw new ArgumentNullException( "actionContext" );
        }

        //List out all Form Body Values
        body = actionContext.Request.Content.ReadAsStringAsync().Result;
    }

    // Implement Interface and use code to read the body
    // and find your Value matching your Key
}
于 2015-06-04T03:29:32.677 に答える