Подтвердить что ты не робот

MVC 4 ModelBinder

Мне нужно знать, как создать пользовательский IModelBinder в MVC 4, и он был изменен.

Новый метод, который должен быть реализован:

bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext);
4b9b3361

Ответ 1

Существует 2 интерфейса IModelBinder:

  • System.Web.Mvc.IModelBinder, который аналогичен предыдущим версиям и не изменился
  • System.Web.Http.ModelBinding.IModelBinder, который используется веб-API и ApiController. Поэтому в основном внутри этого метода вы должны установить actionContext.ActionArguments соответствующие значения. Вы больше не возвращаете экземпляр модели.

Ответ 2

Эта ссылка, предоставленная Стивом, дает полный ответ. Я добавляю его здесь для справки. Кредит идет на 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)

Ответ 3

Даже простой способ добавить modelbinder без ModelBinderProvider заключается в следующем:

GlobalConfiguration.Configuration.BindParameter(typeof(User), new CustomModelBinder());

Ответ 4

Опубликованное обновление RC для сообщения Todd:

Было добавлено добавление поставщика привязки к вашей модели:

var configuration = GlobalConfiguration.Configuration;

configuration.Services.Add(typeof(ModelBinderProvider), new YourModelBinderProvider());