【问题标题】:date format dd/MM/yyyy not working in asp.net mvc 5日期格式 dd/MM/yyyy 在 asp.net mvc 5 中不起作用
【发布时间】:2016-03-11 15:30:23
【问题描述】:

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

24/01/2016

但它显示验证消息为:

JoiningDate 字段必须是日期。

这是我尝试过的:

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

另外,我希望它在用户端的任何地方都以 dd/MM/yyyy 格式显示日期,但这是我问题的第二部分,首先,它至少应该允许一个有效的日期输入。我被困在这个问题上,任何帮助都将深深感激,我已经搜索了所有内容,但我无法直截了当,在此先感谢 :)

【问题讨论】:

  • 尝试使用数据类型:[DataType(DataType.Date)]
  • 请创建一个MCVE
  • 假设您的服务器文化是接受dd/MM/yyyy 中的日期的文化,那么问题是jquery.validate 验证MM/dd/yyyy 格式的日期。您没有说明您是否使用日期选择器,但请参阅 this answer 了解一些选项
  • @StephenMuecke ,我试过 jquery.validate 但没有成功,现在,它正在显示 jQuery 验证消息 The value '24/01/2015' is not valid for Joining Date. ,我已经为此苦苦挣扎了 2 天,我非常需要你: (
  • 如果您使用客户端验证,那么您需要根据链接配置验证器(例如使用 jquery.globalize,js)。如果您之前没有使用客户端验证,则错误表明服务器上的文化不接受 dd/MM/yyyy 格式的日期(所以更改它,或使用自定义 ModelBinder

标签: datetime asp.net-mvc-5 date-formatting


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我想出了更清洁的解决方案。

    由于 jquery.validate.unobtrusive.min.js 中的 MVC 错误(甚至在 MVC 5 中)可能会出现客户端验证问题,该错误不接受任何日期/日期时间格式。不幸的是,您必须手动解决它。

    我的最终解决方案:

    之前必须包含:

    @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();
        }
    });
    

    【讨论】:

    • 这很完美!不要忘记在BundleConfig.cs中注册moment.js,否则它不会渲染。
    【解决方案3】:

    我得到了答案,为了解决这个问题,我使用了自定义 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多