Эта ссылка , предоставленная Стивом, дает полный ответ.Я добавляю это сюда для справки.На форумах asp.net кредит идет на дравву.
Сначала создайте класс, полученный из IModelBinder
.Как говорит Дарин, обязательно используйте пространство имен System.Web.Http.ModelBinding
, а не привычный эквивалент MVC.
public class CustomModelBinder : IModelBinder
{
public CustomModelBinder()
{
//Console.WriteLine("In CustomModelBinder ctr");
}
public bool BindModel(
HttpActionContext actionContext,
ModelBindingContext bindingContext)
{
//Console.WriteLine("In BindModel");
bindingContext.Model = new User() { Id = 2, Name = "foo" };
return true;
}
}
Далее укажите поставщика, который действует как фабрика для вашего нового связующего, и любых других связующих, которые выможет добавить в будущем.
public class CustomModelBinderProvider : ModelBinderProvider
{
CustomModelBinder cmb = new CustomModelBinder();
public CustomModelBinderProvider()
{
//Console.WriteLine("In CustomModelBinderProvider ctr");
}
public override IModelBinder GetBinder(
HttpActionContext actionContext,
ModelBindingContext bindingContext)
{
if (bindingContext.ModelType == typeof(User))
{
return cmb;
}
return null;
}
}
Наконец, включите в ваш Global.asax.cs следующее (например, Application_Start).
var configuration = GlobalConfiguration.Configuration;
IEnumerable<object> modelBinderProviderServices = configuration.ServiceResolver.GetServices(typeof(ModelBinderProvider));
List<Object> services = new List<object>(modelBinderProviderServices);
services.Add(new CustomModelBinderProvider());
configuration.ServiceResolver.SetServices(typeof(ModelBinderProvider), services.ToArray());
Теперь вы можете просто отменить новыйвведите в качестве параметра для ваших методов действия.
public HttpResponseMessage<Contact> Get([ModelBinder(typeof(CustomModelBinderProvider))] User user)
или даже
public HttpResponseMessage<Contact> Get(User user)