Click here to Skip to main content
13,899,685 members
Click here to Skip to main content
Add your own
alternative version

Tagged as


2 bookmarked
Posted 20 Jul 2013
Licenced CPOL

MVC Complex Model Postback: Bind Field to JSON string

, 20 Jul 2013
Rate this:
Please Sign up or sign in to vote.
MVC Complex model postback: bind field to JSON string


In my scenario, model had both simple fields directly bindable to input controls, and an array of complex objects that was constructed using fancy JavaScript. I had to submit the whole model using one form postback (no AJAX).

This is the model (the challenge here was to bind ComplexData):

public class ComplexModel
    public string FirstName {get;set;}
    public string LastName {get;set;}

    public List<ComplexObject> ComplexData {get;set;}

Controller is trivial:

public class ComplexController : Controller
    public ViewResult Save(ComplexModel model)
        // save it

View binds FirstName and LastName directly to inputs and ComplexData property is prepared just before form submit by stringifying the JSON object. Formatted JSON string is placed in a hidden field.

    $(document).ready(function () {
        $('form').submit(function () {

    <input name='FirstName'/>
    <input name='LastName'/>
    <input type='hidden' name='ComplexData'/>
    <input type='submit' value='Save!' />

So the problem was to bind JSON string to the ComplexObject. The solution to the problem was to create custom attribute:

public class JsonBindableAttribute : Attribute

… and a custom model binder:

public class JsonPropBinder : DefaultModelBinder
    protected override object GetPropertyValue(ControllerContext controllerContext,
    ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor,
    IModelBinder propertyBinder)
        if (propertyDescriptor.Attributes.OfType<Attribute>().
        Any(x => (x is JsonBindableAttribute)))
            var value = bindingContext.ValueProvider.
            return JsonConvert.DeserializeObject
            (value, propertyDescriptor.PropertyType);
        return base.GetPropertyValue(controllerContext, bindingContext,
                              propertyDescriptor, propertyBinder);

… and finally register the binder:

protected void Application_Start()
    ModelBinders.Binders.Add(typeof(ComplexModel), new JsonPropBinder());


This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


About the Author

Australia Australia
No Biography provided

You may also be interested in...


Comments and Discussions

QuestionThank you!!. Exactly what I need Pin
choi83012-Jun-15 8:48
memberchoi83012-Jun-15 8:48 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Cookies | Terms of Use | Mobile
Web03 | 2.8.190306.1 | Last Updated 20 Jul 2013
Article Copyright 2013 by m_kramar
Everything else Copyright © CodeProject, 1999-2019
Layout: fixed | fluid