如何使用`BindModel(HttpActionContext actionContext ...`签名?)创建自定义模型绑定器?

时间:2012-03-28 15:03:23

标签: asp.net-mvc asp.net-mvc-4 asp.net-web-api imodelbinder

我需要知道如何在MVC 4中创建自定义IModelBinder并且它已被更改。

必须实施的新方法是:

bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext);

4 个答案:

答案 0 :(得分:28)

有2个IModelBinder接口:

  1. System.Web.Mvc.IModelBinder与先前版本相同且未更改
  2. System.Web.Http.ModelBinding.IModelBinder,由Web API和ApiController使用。因此,基本上在此方法中,您必须将actionContext.ActionArguments设置为相应的值。您不再返回模型实例。

答案 1 :(得分:24)

史蒂夫提供的

This link提供了完整的答案。我在这里添加它以供参考。感谢asp.net论坛上的dravva。

首先,创建一个派生自IModelBinder的类。正如Darin所说,请务必使用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)

答案 2 :(得分:8)

在没有ModelBinderProvider的情况下添加模型绑定器的一种简单方法是:

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

答案 3 :(得分:3)

对Todd帖子的RC后更新:

简化了添加模型绑定程序提供程序:

var configuration = GlobalConfiguration.Configuration;

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