在mvc中以MM / dd / YYYY格式验证日期

时间:2013-05-17 09:50:03

标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-4

我在MVC信息文件中声明了一个属性,如

  [Required(ErrorMessage = "End Date has not being entered")]
        [DataType(DataType.Date)]
        [DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}", ApplyFormatInEditMode = true)]
        [RegularExpression(@"^(0[1-9]|1[012])[/](0[1-9]|[12][0-9]|3[01])[/]\d{4}$", ErrorMessage = "End Date should be in MM/dd/yyyy format")]
        public DateTime? ExpirationDate { get; set; }

但是当我以正确的格式输入日期时,如5/13/2013。它仍然显示错误消息

End Date should be in MM/dd/yyyy format

我缺少哪些代码或上述内容有任何其他错误。

4 个答案:

答案 0 :(得分:3)

您无法使用正则表达式验证日期,请使用DateTime.TryParseExact将字符串转换为DateTime对象。正则表达式总会错过闰年等微妙之处。

答案 1 :(得分:1)

您不能使用正则表达式来验证模型中的DateTime,因为正则表达式总是验证字符串值,当您在DateTime上应用它时,它会尝试转换为字符串。该字符串实际上不是MM / dd / YYYY格式,并且始终抛出验证错误。

您可以选择以下方式之一:

    资源文件中的
  1. Customize the error message
  2. 您可以创建从RegularExpressionAttribute派生的自定义属性,然后使用该属性。

答案 2 :(得分:0)

正则表达式的第一部分不允许单个数字月份。你应该把它改成

(@"^([0]?\d|[1][0-2])/..."

请注意?标记,这意味着0是可选的。

答案 3 :(得分:0)

查看。我试过这个并不期望它能起作用。

您实际上可以使用RegExp验证MVC中的DateTime 。这是我的设置:


属性上的RegExp属性:

[正则表达式(@“(^ $)|(^ \ d {2} / \ d {2} / \ d {4})|(^((\ d {1})|(\ d {2 }))/((\ d {1})|(\ d {2}))/(\ d {4})\ S((\ d {1})|(\ d {2}))[: ] {1}((\ d {1})|(\ d {2}))[:] {1}((\ d {1})|(\ d {2}))\ S((AM) |(PM)))“,ErrorMessage =”无效日期“)]


强制验证: 空字符串, MM / dd / yyyy格式的月份/日期的1或2位数字(例如2015年3月20日或2015年3月20日或2015年3月2日), C#日期(例如MM / dd / yyyy hh:mm:ss tt) - 一旦服务器将其转换为C#DateTime

,这就允许ModelState.IsValid为此属性返回true

TextBoxFor on view: @ Html.TextBoxFor(x => x.DateOfWeightAndHeightCapture,“{0:MM / dd / yyyy}”,new {@class =“form-control”})


这使您可以在模型上拥有一个由MVC TextBoxFor编辑的DateTime属性,该属性强制执行客户端和服务器端验证。