ASP.NET MVC2 - Custom Model Binder Examples
Asked Answered
T

2

16

I am trying to find some examples of building a custom model binder for a unique binding scenario I need to handle, but all of the articles I found were for older versions of MVC which are no longer relevant in MVC2. I've been referencing the DefaultModelBinder source code to try to get a general feel for what I need to do, but it's entirely more complicated than my scenario and I'm having trouble isolating the specific logic I need to implement.

My goal is to take a collection of Checkbox/Textbox pairs and for all of the Checked pairs I would like to create a key/value pair of the Checkbox's value and the associated Textbox's value. After aggregating this data I need to do some string serialization on the collection so I can store it in a string property of the desired Model type. I already the data being sent from the form in a manageable format which will allow me to relate a given Checkbox to a specific Textbox, it's just a matter of figuring out how to get all the pieces where I need them.

Does anyone know of some up-to-date tutorials that can get me started with building a custom model binder?

Teutonic answered 26/2, 2010 at 18:30 Comment(0)
T
12

I don't know why you think a lot has changed since MVC 1 regarding custom model binders. But If I understand what you are trying to do, it should be fairly easy.

public class CustomModelBinder : DefaultModelBinder {
    public override object BindModel(ControllerContext controllerContext, 
        ModelBindingContext bindingContext) {

        NameValueCollection form = controllerContext.HttpContext.Request.Form;
        //get what you need from the form collection

        //creata your model
        SomeModel myModel = new SomeMode();
        myModel.Property = "value";
        //or add some model errors if you need to
        ModelStateDictionary mState = bindingContext.ModelState;
        mState.Add("Property", new ModelState { });
        mState.AddModelError("Property", "There's an error.");

        return myModel; //return your model
    }
}

And your action :

public ActionResult Contact([ModelBinder(typeof(CustomModelBinder))]SomeModel m){
    //...
}

Was that the kind of information you are looking for?

Transmutation answered 26/2, 2010 at 18:50 Comment(3)
This technique totally works for me, but I was under the impression I should make use of the bindingContext.ValueProvider rather than accessing the HttpContext directly (for testability reasons).Teutonic
@Nathan Taylor, I see. In that case, the technique described here might get you started. hanselman.com/blog/… S. Hanselman also provides an example here about how to test the binder : #254074Semitone
Also, if you're looking for doing model binding based on a specific (or generic) type, check the post here: #1487505Quaky
H
1

Take a look at several examples of Custom MVC Model binders on my blog.

Hypso answered 9/2, 2012 at 8:20 Comment(1)
Website is down and the examples should be posted here - not an external site.Unaware

© 2022 - 2024 — McMap. All rights reserved.