find a location for property in a new city

Wednesday, 6 July 2011

Custom Model Binder for binding drop downs into a DateTime in MVC

I have a Nullable DateTime Property in my Model I want to bind painlessly with three drop down select boxes I have for Day Month and Year respectively.

First thing to do is to make a new shiny custom model binder. I have done mine by inheriting from DefaultModelBinder (which you will need to include System.Web.Mvc to access).
using System;
using System.ComponentModel;
using System.Web.Mvc;

namespace Infrastructure.OFP.ModelBinders
{
    public class MyUserModelBinder : DefaultModelBinder
    {
        protected override void BindProperty(ControllerContext controllerContext,
            ModelBindingContext bindingContext, PropertyDescriptor propertyDescriptor)
        {
            if (propertyDescriptor.PropertyType == typeof(DateTime?)
                && propertyDescriptor.Name == "DateOfBirth")
            {
                var request = controllerContext.HttpContext.Request;
                var prefix = propertyDescriptor.Name;
    
//remember I am a Brit so this will give me dd/mm/yyyy format - this may not work for you :)
//also since this is a binder specific for one particular form the hardcoding of
//    MyUser.DateOfBirth is suitable
//AND... I am using Value because I am using a Nullable
                var date = string.Format("{0}/{1}/{2}",
                           request["MyUser.DateOfBirth.Value.Day"],
                           request["MyUser.DateOfBirth.Value.Month"],
                           request["MyUser.DateOfBirth.Value.Year"]);

                DateTime dateOfBirth;
                if (DateTime.TryParse(date, out dateOfBirth))
                {
                    SetProperty(controllerContext, bindingContext,
                                propertyDescriptor, dateOfBirth);
                    return;
                }
                else
                {
                    bindingContext.ModelState.AddModelError("DateOfBirth",
                           "Date was not recognised");
                    return;
                }
            }
            base.BindProperty(controllerContext, bindingContext, propertyDescriptor);
        }
    }
}

This new Model Binder will need to be registered to be used when binding a MyUser object. You do this in the Global.asax Application_Start() like so:
protected void Application_Start()
{
    ModelBinders.Binders[typeof(MyUser)] = new MyUserModelBinder();
    AreaRegistration.RegisterAllAreas();
    RegisterRoutes(RouteTable.Routes);
}

For reference the drop downs I created to populate the nullable DateTime property of DateOfBirth is as follows:
@Html.DropDownListFor(m => m.MyUser.DateOfBirth.Value.Day,
                      new SelectList(Model.Days, "Key", "Value"))
@Html.DropDownListFor(m => m.MyUser.DateOfBirth.Value.Month,
                      new SelectList(Model.Months, "Key", "Value"))
@Html.DropDownListFor(m => m.MyUser.DateOfBirth.Value.Year,
                      new SelectList(Model.Years, "Key", "Value"))
@Html.ValidationMessageFor(m => m.MyUser.DateOfBirth)

This works as I expected it to. It validates the property as expected using the DataAnnotations that I have defined for it.

Follow britishdev on Twitter

26 comments:

  1. Hello Colin,

    Any chance you can provide a complete example of your solution?

    Thanks,
    Andreas

    ReplyDelete
  2. Yep, complete example is what would help. Thank you,

    ReplyDelete
    Replies
    1. Admittedly the article is a little blunt and straight down to code, but what is it you feel is incomplete about the example exactly? Maybe I can elaborate. Although bear in mind I wrote this almost a year ago :)

      Delete
  3. This was extremely helpful Colin. Great work!

    ReplyDelete
  4. Motifz Designer Lawn. 1, 2 & 3 Piece Unstitched Premium Embroidered Lawn 2019, Premium embroidered Lawn, Premium lawn, Premium lawn 2019, Motifz, Premium lawn in Pakistan. Shipping worldwide. Stitching option available.

    ReplyDelete
  5. Online Custom Essay Services are affordable, with rates that are relatively lower in comparison with other Legitimate Custom Essay Writing Services since they allow learners to estimate charges when placing Legitimate Custom Writing Service Orders.

    ReplyDelete
  6. Buy online wholesale printed candle boxes and packaging at easy prices and shipping worldwide, with 24/7 customer support. Get a free custom quote now!!

    ReplyDelete
  7. Buy online wholesale printed custom lipstick boxes and packaging at easy prices and shipping worldwide, with 24/7 customer support. Get a free custom quote now!!

    ReplyDelete
  8. Blackbird packaging provide you with any size, shape design, cbd bath bomb boxes sooner than any other packaging competitor in the market

    ReplyDelete
  9. Packaging town is a one-stop solution for the short-run tincure packaging needs, and supplies. At affordable prices. Request a free quote now.

    ReplyDelete
  10. Blackbird packaging provide you with any size, shape design, custom bath bomb display boxes sooner than any other packaging competitor in the market

    ReplyDelete
  11. Great Article
    Cloud Computing Projects




    Networking Projects



    Final Year

    Projects for CSE





    JavaScript Training in Chennai



    JavaScript

    Training in Chennai




    The Angular Training covers a wide range of topics including Components, Angular Directives, Angular Services, Pipes, security fundamentals,

    Routing, and Angular programmability. The new Angular TRaining will lay the foundation you need to specialise in Single Page Application developer.

    Angular Training

    ReplyDelete
  12. Hello, This is a Nitu roy very interesting blog. this content is written very well This is an amazing
    post, keep blogging.thanks for sharing.Anyways I am here now and could just like to say thank
    for a tremendous post and a all round entertaining website.
    Guwahati Escort
    Call girl service in Guwahati

    ReplyDelete
  13. Hello, My Dearest Friends Super class independent Escorts Services available incall & outcall
    service in VIP hotels.and call girls available for booking 24x7 hours IF You
    want Physical Relationship any time contact me & ?meet with me to get my
    number from website and call
    Thank You & Visit Again""_____
    Guwahati Call Girls
    Call Girls in Guwahati

    ReplyDelete
  14. Maybe you are also looking for the right person to ensure the higher quality
    sex and that’s why you are in this place because here we are going to share
    the data and information of Guwahati Escorts.
    Guwahati escorts
    Escorts in Guwahati

    ReplyDelete
  15. Blackbird packaging company can provide you with any size, shape design, and packaging for bath bombs sooner than any other packaging competitor in the market

    ReplyDelete
  16. Packaging town is a one stop solution for the short-run custom soap boxes needs and supplies. At affordable prices. Request a free quote now.

    ReplyDelete
  17. Explore the profiles of guwahati escorts, guwahati call girls, call girls in guwahati and
    escorts in guwahati for female companionship in top rated hotels.
    Get affordable escort services in guwahati hotels now.
    Guwahati call girl
    Guwahati escort service

    ReplyDelete
  18. Blackbird packaging provide you with any size, shape design, cbd bath bombs wholesale sooner than any other packaging competitor in the market

    ReplyDelete
  19. Blackbird packaging provide you with any size, shape design, bath bomb boxes sooner than any other packaging competitor in the market

    ReplyDelete
  20. Packaging town is a one stop solution for the short-run custom pillow boxes needs and supplies. At affordable prices. Request a free quote now.

    ReplyDelete
  21. Blackbird packaging provide you with any size, shape design, bath bomb boxes sooner than any other packaging competitor in the market

    ReplyDelete
  22. Packaging town is a one stop solution for the short-run custom candle boxes needs and supplies. At affordable prices. Request a free quote now.

    ReplyDelete
  23. Blackbird packaging provide you with any size, shape design, cookie boxes wholesale sooner than any other packaging competitor in the market

    ReplyDelete
  24. Packaging town is a one stop solution for the short-run rigid boxes needs and supplies. At affordable prices. Request a free quote now.

    ReplyDelete