Мне нужно знать, как создать пользовательский IModelBinder
в MVC 4, и он был изменен.
Новый метод, который должен быть реализован:
bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext);
Мне нужно знать, как создать пользовательский IModelBinder
в MVC 4, и он был изменен.
Новый метод, который должен быть реализован:
bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext);
Существует 2 интерфейса IModelBinder:
System.Web.Mvc.IModelBinder
, который аналогичен предыдущим версиям и не изменилсяSystem.Web.Http.ModelBinding.IModelBinder
, который используется веб-API и ApiController. Поэтому в основном внутри этого метода вы должны установить actionContext.ActionArguments
соответствующие значения. Вы больше не возвращаете экземпляр модели.Эта ссылка, предоставленная Стивом, дает полный ответ. Я добавляю его здесь для справки. Кредит идет на dravva на форумах 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;
}
}
Далее укажите поставщика, который будет действовать как factory для вашего нового связующего и любых других связующих, которые вы можете добавить в будущем.
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)
Даже простой способ добавить modelbinder без ModelBinderProvider заключается в следующем:
GlobalConfiguration.Configuration.BindParameter(typeof(User), new CustomModelBinder());
Опубликованное обновление RC для сообщения Todd:
Было добавлено добавление поставщика привязки к вашей модели:
var configuration = GlobalConfiguration.Configuration;
configuration.Services.Add(typeof(ModelBinderProvider), new YourModelBinderProvider());