从身体绑定时如何进行自定义模型绑定?

时间:2013-03-18 09:52:18

标签: asp.net asp.net-web-api

我一直在尝试使用模型绑定来使我们的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属性时,我只会看到QueryStringValueProviderRouteDataValueProvider,我认为这意味着如果数据在正文中,我就不会得到它。我该怎么做?我想支持将数据发布为json或form-encoded。

1 个答案:

答案 0 :(得分:3)

我也在研究这个问题。

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

QueryStringValueProviderFactory& RouteDataValueProviderFactory

致电

时会搜索哪些内容
context.ValueProvider.GetValue

这个问题有一些关于如何绑定身体数据的代码。

how to pass the result model object out of 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
}