Model Binding in ASP.NET MVC

March 27, 2017
4 min read
Introduction

In this article we will see (hopefully) the magic (in my opinion) of Model Binding in ASP.NET MVC, a framework mechanism that makes our life easier.

Context

Model Binding is useful when we want to submit a form and retrieve the submitted values on the server. Essentially this mechanism binds html inputs from the view to class properties on the server. The binding is done by the ‘name’ attribute of the html elements. Let`s try to illustrate this with an example and suppose we have a View with the following Form: 


<form action="/User/Submit" method="post">    
    <div class="form-group">
        <label for="firstName">First Name</label>
        <input type="text" class="form-control" id="firstName" name="FirstName">
    </div>
    <div class="form-group">
        <label for="lastName">Last Name</label>
        <input type="text" class="form-control" id="lastName" name="LastName">
    </div>
    <button type="submit" class="btn btn-primary">Submit</button>
</form>

Of course it is easier and more elegant to use html helpers for forms, labels and inputs but this better illustrates the concept. Notice that we have two text inputs, one with the name attribute “FirstName” and the other with the name “LastName”. This means that these two inputs will bind to two properties with the same name as shown below:


public class UserViewModel
    {        
        public string FirstName { get; set; }

        public string LastName { get; set; }
    }
public class UserController : Controller
    {                
        [HttpPost]
        public ActionResult Submit(UserViewModel model)
        {
            var firstName = model.FirstName;
            var lastName = model.LastName;

            // return ...
        }
    }

You can see that our Submit action has a UserViewModel parameter. This means that when the form gets submitted the Model Binding mechanism will automatically (dare I say magically?) create the model parameter with the respective properties containing submitted values. This is a simple one-to-one binding example but we can do a lot more. Suppose we want to add Address fields (Address, Address 2, Address 3). We could add three different properties in the same manner or we could add a list property. In order to bind to a list all binded inputs must have the same name attribute and same as the property.


<form action="/User/Submit" method="post">    <div class="form-group">

        <label for="firstName">First Name</label>

        <input type="text" class="form-control" id="firstName" name="FirstName">

    </div>

    <div class="form-group">

        <label for="lastName">Last Name</label>

        <input type="text" class="form-control" id="lastName" name="LastName">

    </div>

    <div class="form-group">

        <label for="address1">Address</label>

        <input type="text" class="form-control" id="address1" name="Address">

    </div>

    <div class="form-group">

        <label for="address2">Address 2</label>

        <input type="text" class="form-control" id="address2" name="Address">

    </div>

    <div class="form-group">

        <label for="address3">Address 3</label>

        <input type="text" class="form-control" id="address3" name="Address">

    </div>

    <button type="submit" class="btn btn-primary">Submit</button>

</form>

Notice how all three addresses have the same name “Address”. And in the ViewModel we have an Address property like this:


public class UserViewModel
    {        
        public string FirstName { get; set; }

        public string LastName { get; set; }

        public List string Address { get; set; }
    }

We can also bind to complex types. For instance we could have an Address type and a property in the ViewModel of type Address like this:


public class Address
    {
        public string Street { get; set; }

        public string ZipCode { get; set; }
    }

public class UserViewModel	
    {        
        public string FirstName { get; set; }

        public string LastName { get; set; }

        public Address Address { get; set; }
    }

In order to bind to complex types the name of the html input must contain the chain of properties separated by a dot. like so:


<form action="/User/Submit" method="post">    
    <div class="form-group">
        <label for="firstName">First Name</label>
        <input type="text" class="form-control" id="firstName" name="FirstName">
    </div>
    <div class="form-group">
        <label for="lastName">Last Name</label>
        <input type="text" class="form-control" id="lastName" name="LastName">
    </div>
    <div class="form-group">
        <label for="street">Street</label>
        <input type="text" class="form-control" id="street" name="Address.Street">
    </div>
    <div class="form-group">
        <label for="zipCode">Zip Code</label>
        <input type="text" class="form-control" id="zipCode" name="Address.ZipCode">
    </div>
    <button type="submit" class="btn btn-primary">Submit</button>
</form>

As you can see we have the name attributes “Address.Street” and “Address.ZipCode”. It is also possible to bind to a Dictionary type property and various other types or we could even create our custom Model Binder instead of using the default one if we want to by implementing the IModelBinder interface. Using the built-in Request and FormCollection properties to retrieve the values on the server is also an option but I find that Model Binding to a ViewModel class is much cleaner.

Conclusion

Model Binding is quite useful and makes our life easier when we want to pass values from the View to the Server while also maintaining a clean code base without any drawbacks that I can think of (except maybe a slight accommodation issue).

To understand more about Model Binding in ASP.NET MVC, please read the following article

 Model Binding in ASP.NET MVC

Share on:

Want to stay on top of everything?

Get updates on industry developments and the software solutions we can now create for a smooth digital transformation.

* I read and understood the ASSIST Software website's terms of use and privacy policy.

Frequently Asked Questions

1. What is ASSIST Software's development process?  

The Software Development Life Cycle (SDLC) we employ defines the following stages for a software project. Our SDLC phases include planning, requirement gathering, product design, development, testing, deployment, and maintenance.

2. What software development methodology does ASSIST Software use?  

ASSIST Software primarily leverages Agile principles for flexibility and adaptability. This means we break down projects into smaller, manageable sprints, allowing continuous feedback and iteration throughout the development cycle. We also incorporate elements from other methodologies to increase efficiency as needed. For example, we use Scrum for project roles and collaboration, and Kanban boards to see workflow and manage tasks. As per the Waterfall approach, we emphasize precise planning and documentation during the initial stages.

3. I'm considering a custom application. Should I focus on a desktop, mobile or web app?  

We can offer software consultancy services to determine the type of software you need based on your specific requirements. Please explore what type of app development would suit your custom build product.   

  • A web application runs on a web browser and is accessible from any device with an internet connection. (e.g., online store, social media platform)   
  • Mobile app developers design applications mainly for smartphones and tablets, such as games and productivity tools. However, they can be extended to other devices, such as smartwatches.    
  • Desktop applications are installed directly on a computer (e.g., photo editing software, word processors).   
  • Enterprise software manages complex business functions within an organization (e.g., Customer Relationship Management (CRM), Enterprise Resource Planning (ERP)).

4. My software product is complex. Are you familiar with the Scaled Agile methodology?

We have been in the software engineering industry for 30 years. During this time, we have worked on bespoke software that needed creative thinking, innovation, and customized solutions. 

Scaled Agile refers to frameworks and practices that help large organizations adopt Agile methodologies. Traditional Agile is designed for small, self-organizing teams. Scaled Agile addresses the challenges of implementing Agile across multiple teams working on complex projects.  

SAFe provides a structured approach for aligning teams, coordinating work, and delivering value at scale. It focuses on collaboration, communication, and continuous delivery for optimal custom software development services. 

5. How do I choose the best collaboration model with ASSIST Software?  

We offer flexible models. Think about your project and see which models would be right for you.   

  • Dedicated Team: Ideal for complex, long-term projects requiring high continuity and collaboration.   
  • Team Augmentation: Perfect for short-term projects or existing teams needing additional expertise.   
  • Project-Based Model: Best for well-defined projects with clear deliverables and a fixed budget.   

Contact us to discuss the advantages and disadvantages of each model. 

ASSIST Software Team Members

See the past, present and future of tech through the eyes of an experienced Romanian custom software company. The ASSIST Insider newsletter highlights your path to digital transformation.

* I read and understood the ASSIST Software website's terms of use and privacy policy.

Follow us

© 2025 ASSIST Software. All rights reserved. Designed with love.