日期格式 dd/MM/yyyy 在 asp.net mvc 5 中不起作用

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

我正在开发一个 asp.net mvc 5 应用程序,我正在尝试为 dd/MM/yyyy 格式设置验证,我已经一直在努力寻找合适的解决方案但没有成功,我希望它接受:

24/01/2016

但它显示验证消息为:

The field JoiningDate must be a date.

这是我试过的方法:

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

此外,我希望它在用户端以 dd/MM/yyyy 格式显示日期,但这是我问题的第二部分,首先,它应该至少允许输入有效的日期。我坚持这一点,任何帮助都会 深切 感激,我搜索了所有内容,但我无法达到目的,提前致谢 :)

我得到了答案,我使用了自定义的ModelBinder,为了解决这个问题,

首先,我在Global.asax的application_start方法中注册了这一行:

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

这是自定义的 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);
    }
}

感谢 Darin Dimitrov 的 answer

我发现最简单的方法是放在 web.config 下面的代码中

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

我找到了更简洁的解决方案。

由于 jquery.validate.unobtrusive.min.js 中的 MVC 错误(即使在 MVC 5 中)可能会出现客户端验证问题,不接受 date/datetime以任何方式格式化。不幸的是你必须手动解决它。

我最终的解决方案:

您必须在之前包括:

@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")

您可以安装 moment.js 使用:

Install-Package Moment.js

然后您终于可以为日期格式解析器添加修复:

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