date format dd/MM/yyyy not working in asp.net mvc 5

16,181

Solution 1

I got the answer, I used custom ModelBinder, in order to resolve this issue,

Firstly, I registered this line in the application_start method in Global.asax:

ModelBinders.Binders.Add(typeof(DateTime?), new MyDateTimeModelBinder());

Here is the custom ModelBinder :

public class MyDateTimeModelBinder : DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var displayFormat = bindingContext.ModelMetadata.DisplayFormatString;
        var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);

        if (!string.IsNullOrEmpty(displayFormat) && value != null)
        {
            DateTime date;
            displayFormat = displayFormat.Replace("{0:", string.Empty).Replace("}", string.Empty);
            // use the format specified in the DisplayFormat attribute to parse the date
            if (DateTime.TryParseExact(value.AttemptedValue, displayFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out date))
            {
                return date;
            }
            else
            {
                bindingContext.ModelState.AddModelError(
                    bindingContext.ModelName,
                    string.Format("{0} is an invalid date format", value.AttemptedValue)
                );
            }
        }

        return base.BindModel(controllerContext, bindingContext);
    }
}

Thanks to Darin Dimitrov's answer!

Solution 2

The easiest way, I found was put in the web.config the code below

 <system.web>
    <globalization uiCulture="en" culture="en-GB"/>
</system.web>

Solution 3

There is much cleaner solution i figured out.

Client validation issues can occur because of MVC bug (even in MVC 5) in jquery.validate.unobtrusive.min.js which does not accept date/datetime format in any way. Unfortunately you have to solve it manually.

My finally working solution:

You have to include before:

@Scripts.Render("~/Scripts/jquery-3.1.1.js")
@Scripts.Render("~/Scripts/jquery.validate.min.js")
@Scripts.Render("~/Scripts/jquery.validate.unobtrusive.min.js")
@Scripts.Render("~/Scripts/moment.js")

You can install moment.js using:

Install-Package Moment.js

And then you can finally add fix for date format parser:

$(function () {
    $.validator.methods.date = function (value, element) {
        return this.optional(element) || moment(value, "DD.MM.YYYY", true).isValid();
    }
});
Share:
16,181

Related videos on Youtube

Bilal Ahmed
Author by

Bilal Ahmed

Tech enthusiast: ASP.NET MVC, Entity Framework (ORM), Razor and LINQ to SQL. SQL Server, ADO.NET, Stored Procedures, Table Types, MYSQL Web API, Windows Service, Windows Forms REST / SOAP APIs Ionic 4, Angular 8, Typescript, JQUERY, JavaScript, AJAX &amp; JSON SQL Dependency, SignalR HTML, HTML5, CSS, CSS3, Bootstrap Crystal Report Google HighCharts API, DataTables.js, ActionMailer.Net, DotNet Zip

Updated on September 16, 2022

Comments

  • Bilal Ahmed
    Bilal Ahmed over 1 year

    I'm developing an asp.net mvc 5 application, in which I'm trying to set a validation for dd/MM/yyyy format, I've been struggling a lot to find an appropriate solution but no success, what I want it to accept:

    24/01/2016

    but it displays validation message as :

    The field JoiningDate must be a date.

    Here is what I've tried :

    [DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)]
    public DateTime JoiningDate { get; set; }
    

    Also, I want it to display the date in dd/MM/yyyy format everywhere at the user's end but this is a second part of my question, firstly, it should at least allow a valid date input. I'm stuck on this one, any help will be deeply appreciated, I've searched all over, but I'm not being able to get to the point, Thanks In Advance :)

    • Matt Johnson-Pint
      Matt Johnson-Pint about 8 years
      Please create an MCVE.
  • Gonzalo Hevia Castillo
    Gonzalo Hevia Castillo about 3 years
    This worked perfectly!. Don't forget to register moment.js in the BundleConfig.cs or it will not render.