ASP.NET MVC Model Binder for Generic Type
Asked Answered
S

1

19

Is it possible to create a model binder for a generic type? For example, if I have a type

public class MyType<T>

Is there any way to create a custom model binder that will work for any type of MyType?

Thanks, Nathan

Schnitzler answered 28/9, 2009 at 13:24 Comment(0)
O
27

Create a modelbinder, override BindModel, check the type and do what you need to do

public class MyModelBinder
    : DefaultModelBinder {

    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) {

         if (HasGenericTypeBase(bindingContext.ModelType, typeof(MyType<>)) { 
             // do your thing
         }
         return base.BindModel(controllerContext, bindingContext);
    }
}

Set your model binder to the default in the global.asax

protected void Application_Start() {

        // Model Binder for My Type
        ModelBinders.Binders.DefaultBinder = new MyModelBinder();
    }

checks for matching generic base

    private bool HasGenericTypeBase(Type type, Type genericType)
    {
        while (type != typeof(object))
        {
            if (type.IsGenericType && type.GetGenericTypeDefinition() == genericType) return true;
            type = type.BaseType;
        }

        return false;
    }
Outgrow answered 28/9, 2009 at 13:36 Comment(2)
Since this question still ranks pretty high on google's results, I'd like to mention that perhaps a better solution that has come out with MVC3 is to use Model Binder Providers. This makes is so that you don't have to replace the default binder if all you're doing is trying to add special rules for binding a particular type, which makes custom model binding much more scalable.Absorptance
I was struggling to find how to set custom model binder for all types in mvc 2 application. And here is the solution! Thanks a lot!Hilariohilarious

© 2022 - 2024 — McMap. All rights reserved.