如何从WebAPI中的自定义绑定器调用默认模型绑定?

时间:2016-04-08 16:35:14

标签: asp.net-web-api asp.net-web-api2 custom-model-binder

我在WebAPI中有一个自定义模型绑定器,它使用了`Sytem.Web.Http.ModelBinding'中的以下方法。名称空间 是用于为Web API创建自定义模型绑定器的正确名称空间:

public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext)
{

}

我在控制器上有一个HTTP POST,我想要使用这个自定义模型绑定器。发布的对象包含大约100个字段。我想改变其中的两个。我需要的是发生默认模型绑定,然后操纵那两个字段的模型绑定对象,这样一旦控制器收到对象,它就是原始的。

问题是我似乎无法使用上面的模型绑定方法中的默认绑定器来模拟绑定我的对象。在MVC中有以下内容:

base.BindModel(controllerContext, bindingContext);

同样的方法 在WebAPI中工作。也许我正在解决这个错误,还有另一种方法可以实现我想要的,所以请建议一个自定义模型绑定器是不是正确的方法。我试图阻止做的是必须操纵控制器内的发布对象。在模型绑定之后,我可以技术这样做,但是我试图在调用堆栈中更早地做到这一点,这样控制器就不用担心自定义操作了这两个领域。

如何在我的自定义模型绑定器中针对bindingContext启动默认模型绑定,以便我有一个完全填充的对象,然后我可以在返回之前操作/按下我需要的最后两个字段?

1 个答案:

答案 0 :(得分:2)

在WebApi中,'default'模型绑定器是CompositeModelBinder,它包装了所有已注册的模型绑定器。如果您想重新使用它的功能,您可以执行以下操作:

public class MyModelBinder : IModelBinder
{
    public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext)
    {
        if (bindingContext.ModelType != typeof(MyModel)) return false;

        //this is the default webapi model binder provider
        var provider = new CompositeModelBinderProvider(actionContext.ControllerContext.Configuration.Services.GetModelBinderProviders());
        //the default webapi model binder
        var binder = provider.GetBinder(actionContext.ControllerContext.Configuration, typeof(MyModel));

        //let the default binder do it's thing
        var result = binder.BindModel(actionContext, bindingContext);
        if (result == false) return false;

        //TODO: continue with your own binding logic....
    }
}