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);
There are 2 IModelBinder interfaces:
System.Web.Mvc.IModelBinder
which is the same as in previous versions and hasn't changedSystem.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.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)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With