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

2020-07-22 09:29发布

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 :)

3条回答
不美不萌又怎样
2楼-- · 2020-07-22 10:12

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();
    }
});
查看更多
爷、活的狠高调
3楼-- · 2020-07-22 10:13

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!

查看更多
闹够了就滚
4楼-- · 2020-07-22 10:25

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

 <system.web>
    <globalization uiCulture="en" culture="en-GB"/>
</system.web>
查看更多
登录 后发表回答