问题
I need to know how to create a custom IModelBinder
in MVC 4 and it has been changed.
The new method that has to be implemented is :
bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext);
回答1:
There are 2 IModelBinder interfaces:
- System.Web.Mvc.IModelBinder which is the same as in previous versions and hasn't changed
- System.Web.Http.ModelBinding.IModelBinder which is used by the Web API and the ApiController. So basically inside this method you must set the
actionContext.ActionArguments
to the corresponding values. You no longer return a model instance.
回答2:
This link, provided by Steve, provides a complete answer. I'm adding it here for reference. Credit goes to dravva on asp.net forums.
First, create a class derived from IModelBinder
. As Darin says, be sure to use the System.Web.Http.ModelBinding
namespace and not the familiar MVC equivalent.
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;
}
}
Next, provide a provider, which acts as a factory for your new binder, and any other binders you may add in the future.
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;
}
}
Finally, include the following in your Global.asax.cs (e.g., 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());
Now, you can just delare the new type as a parameter to your action methods.
public HttpResponseMessage<Contact> Get([ModelBinder(typeof(CustomModelBinderProvider))] User user)
or even
public HttpResponseMessage<Contact> Get(User user)
回答3:
An even simple way to add a modelbinder without a ModelBinderProvider is this:
GlobalConfiguration.Configuration.BindParameter(typeof(User), new CustomModelBinder());
回答4:
A post RC update to Todd's post:
Adding your model binder provider has been simplified:
var configuration = GlobalConfiguration.Configuration;
configuration.Services.Add(typeof(ModelBinderProvider), new YourModelBinderProvider());
来源:https://stackoverflow.com/questions/9910346/how-do-i-create-a-custom-model-binder-using-the-bindmodelhttpactioncontext-act