覆盖 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 实现给定类型的 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,...)
我想覆盖我的 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 实现给定类型的 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,...)