所以现有的问题都没有回答这个问题。
我已经为web api 2实现了一个自定义模型绑定器,如下所示
public class AModelBinderProvider : IModelBinderProvider
{
public IModelBinder GetBinder(Type modelType)
{
return modelType == typeof(A) ? new AdAccountModelBinder() : null;
}
}
public class AModelBinder : DefaultModelBinder
{
private readonly string _typeNameKey;
public AModelBinder(string typeNameKey = null)
{
_typeNameKey = typeNameKey ?? "type";
}
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var providerResult = bindingContext.ValueProvider.GetValue(_typeNameKey);
if (providerResult != null)
{
var modelTypeName = providerResult.AttemptedValue;
SomeEnum type;
if (!Enum.TryParse(modelTypeName, out type))
{
throw new InvalidOperationException("Bad Type. Does not inherit from AdAccount");
}
Type modelType;
switch (type)
{
case SomeEnum.TypeB:
modelType = typeof (B);
break;
default:
throw new InvalidOperationException("Bad type.");
}
var metaData =
ModelMetadataProviders.Current
.GetMetadataForType(null, modelType);
bindingContext.ModelMetadata = metaData;
}
// Fall back to default model binding behavior
return base.BindModel(controllerContext, bindingContext);
}
模型定义如下 -
Public class A {}
Public Class B : A {}
Web Api行动如下 -
[System.Web.Http.HttpPost]
[System.Web.Http.Route("api/a")]
[System.Web.Http.Authorize]
public async Task<HttpResponseMessage> Add([ModelBinder(typeof(AModelBinderProvider))]Models.A a)
{}
在Application_Start中注册我的提供者作为绅士 -
var provider = new AdAccountModelBinderProvider();
ModelBinderProviders.BinderProviders.Add(provider);
我的自定义Binder仍然拒绝启动。
我迷路了。我错过了什么?
答案 0 :(得分:2)
您需要实现IModelBinder接口:
请查看以下自定义示例:
public class MyModelBinder : IModelBinder
{
public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext)
{
try
{
bindingContext.Model = new TestClass();
//following lines invoke default validation on model
bindingContext.ValidationNode.ValidateAllProperties = true;
bindingContext.ValidationNode.Validate(actionContext);
return true;
}
catch
{
return false;
}
}
}
有几种方法可以设置模型装订器。首先,您可以为参数添加[ModelBinder]属性。
public HttpResponseMessage Get([ModelBinder(typeof(MyModelBinder))] TestClass objTest)
您还可以为该类型添加 [ModelBinder] 属性。 Web API将使用指定的模型绑定器来处理该类型的所有参数。
[ModelBinder(typeof(MyModelBinder))]
public class TestClass
{
// ....
}
最后,您可以将模型绑定器提供程序添加到 HttpConfiguration 。模型绑定器提供程序只是一个创建模型绑定器的工厂类。您可以通过派生 ModelBinderProvider 类来创建提供程序。但是,如果模型绑定器处理单个类型,则更容易使用为此目的而设计的内置 SimpleModelBinderProvider 。以下代码显示了如何执行此操作。
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
var provider = new SimpleModelBinderProvider(
typeof(TestClass), new MyModelBinder());
config.Services.Insert(typeof(ModelBinderProvider), 0, provider);
// ...
}
}
使用模型绑定提供程序,您仍需要将 [ModelBinder] 属性添加到参数中,以告知Web API它应该使用模型绑定程序而不是媒体类型格式化程序。但现在您不需要在属性中指定模型绑定器的类型:
public HttpResponseMessage Get([ModelBinder] TestClass objTestClass) { ... }
答案 1 :(得分:0)
我认为,您应该使用命名空间System.Web.Http.ModelBinder中名称空间System.Web.ModelBinding / IModelBinder的DefaultModelBinder。 我也认为你做了一些不必要的想法,比如在Application_Start中注册提供者,因为你正在使用ModelBinder指令。
有关详细信息,请查看http://blog.learningtree.com/creating-a-custom-web-api-model-binder/
答案 2 :(得分:0)
您可能需要在WebApiConfig中添加自定义参数绑定规则吗?
config.ParameterBindingRules.Insert(0, GetCustomParameterBinding);