在Web Api中覆盖默认的ModelBinder

时间:2018-02-21 07:31:53

标签: c# asp.net-web-api asp.net-web-api2

我想覆盖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"将此属性用作我所有字符串参数的默认值"。

1 个答案:

答案 0 :(得分:1)

ModelBinderProvider旨在涵盖此类情景。这个抽象类有唯一的方法:

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

GetBinder应该返回给定类型IModelBinder的实现,如果无法使用当前绑定器处理类型,则返回null

以下是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,...)