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属性时,我认为这意味着如果数据在正文中,我将不会得到它。我该怎么做?我想支持以 json 或表单编码的形式发布数据。bindingContextQueryStringValueProviderRouteDataValueProvider

4

1 回答 1

3

我也在调查这个。

WebApis Model Binder 带有两个内置的 ValueProviders。

QueryStringValueProviderFactory & RouteDataValueProviderFactory

调用时会搜索哪些内容

context.ValueProvider.GetValue

这个问题有一些关于如何从正文绑定数据的代码。

如何将结果模型对象传递出 System.Web.Http.ModelBinding.IModelBinder。绑定模型?

您也可以创建一个自定义 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 回答