覆盖 Web 中的默认 ModelBinder Api

Override default ModelBinder in Web Api

我想覆盖我的 Web Api 项目的默认模型绑定器。怎么做到的?

更多说明:

我现在做的是:

// I defined a custom model binder 
public class EmptyStringToNullModelBinder : IModelBinder

//Before all my parameters in actions I use it
public IHttpActionResult PostSomething([FromUri(BinderType = typeof(EmptyStringToNullModelBinder))]string text = null,...)

我整个项目中有很多字符串参数赋值了这个属性。这有点难看。我想告诉 Web Api "Use this attribute as default for all my string parameters".

ModelBinderProvider 旨在涵盖这种情况。这个抽象 class 有唯一的方法:

public abstract IModelBinder GetBinder(HttpConfiguration configuration, Type modelType);

GetBinder 应该 return 实现给定类型的 IModelBindernull 如果当前绑定器无法处理该类型。

这是 ModelBinderProvider 的通用实现,它将类型映射到活页夹:

public class CustomModelBinderProvider<TModel> : ModelBinderProvider
{
    private readonly IModelBinder binder;

    public CustomModelBinderProvider(IModelBinder binder)
    {
        this.binder = binder;
    }

    public override IModelBinder GetBinder(HttpConfiguration configuration, Type modelType)
    {
        return modelType == typeof(TModel) ? binder : null;
    }
}

WebApiConfig.Register() 方法中为 String 类型设置此模型绑定器:

public static void Register(HttpConfiguration config)
{
    // ...

    var binderProvider = new CustomModelBinderProvider<string>(new EmptyStringToNullModelBinder());
    config.Services.Insert(typeof(ModelBinderProvider), 0, binderProvider);
}

现在在您的控制器中您不需要指定活页夹类型,EmptyStringToNullModelBinder 将用于字符串类型:

public IHttpActionResult PostSomething([FromUri]string text = null,...)