我需要知道如何在MVC 4中创建自定义IModelBinder
并且它已被更改。
必须实施的新方法是:
bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext);
答案 0 :(得分:28)
有2个IModelBinder接口:
System.Web.Mvc.IModelBinder
与先前版本相同且未更改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());