ASP MVC DateTimevalidation错误

在asp.net MVC 5中,我有一个显示来自DTO对象的数据的表单:

public class FieldDTO { [DataType(DataType.DateTime)] [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd/MM/yyyy}")] public DateTime StartFieldDate { get; set; } [DataType(DataType.DateTime)] [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd/MM/yyyy}")] public DateTime StopFieldDate { get; set; } public String FieldName { get; set; } [DataType(DataType.DateTime)] [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd/MM/yyyy}")] public DateTime StartJob { get; set; } [DataType(DataType.DateTime)] [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd/MM/yyyy}")] public DateTime StopJob { get; set; } } 

在我的控制器类中,我有:

 public ActionResult Create() { var model = new FieldDTO(); model.StartFieldDate = DateTime.Now; model.StopFieldDate = DateTime.Now; model.StartJob = DateTime.Now; model.StopJob = DateTime.Now; ... ... } 

在视图中,我有:

 
@Html.EditorFor(model => model.StartFieldDate, new { htmlAttributes = new { @class = "form-control datepicker" } }) @Html.ValidationMessageFor(model => model.DataTurno, "", new { @class = "text-danger" })

而且,我有另一个datetime控制器的剃刀代码。 我为jQuery UI DatePicker添加了datepicker类。

在表单中,如果我单击“创建”按钮,而不修改任何控件,一切正常。 当我更改最后两个datetime选择器中的一个然后单击“创建”按钮时,我得到validation错误: The field xxxx must be a date.

我不知道问题是什么,因为所有控件都以相同的方式生成。

有许多潜在的问题。

首先, [DataType(DataType.DateTime)][DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd/MM/yyyy}")]属性仅在使用@Html.EditorFor()时适用并用于渲染浏览器实现HTML5日期选择器(它添加了type="date"属性)。 由于您使用的是jQueryUI日期选择器,因此不需要这些属性。 在任何情况下,如果你确实想要浏览器HTML5 datepicker,那么格式需要是DataFormatString = "{0:yyyy-MM-dd}" (ISO格式)才能正常工作。 另请注意,HTML5日期选择器仅在现代浏览器中受支持,在FireFox中根本不支持( 请参阅比较 )

如果您使用jQueryUI日期选择器,那么它可以只是

 @Html.TextBoxFor(m => m.StartFieldDate, new { @class = "form-control datepicker" }) 

并在datepicker脚本中设置格式

 $('.datepicker').datepicker({ dateFormat: 'dd/mm/yy' }); 

validation消息可以来自两个问题之一。 在客户端, jquery-validate.js使用MM/dd/yyyy格式validation日期。 您可以通过包含jquery globalize或添加以下脚本来覆盖它以使用dd/MM/yyyy

 $.validator.addMethod('date', function (value, element) { if (this.optional(element)) { return true; } var valid = true; try { $.datepicker.parseDate('dd/mm/yy', value); } catch (err) { valid = false; } return valid; }); $('.datepicker').datepicker({ dateFormat: 'dd/mm/yy' }); 

另一个潜在的问题是服务器端validation。 如果服务器文化不接受格式为dd/MM/yyyy (例如 ),则可能会在服务器上抛出validation错误,其中您需要为DateTime创建自定义ModelBinder

旁注:我认为@Html.ValidationMessageFor(m => m.DataTurno, ..)是一个拼写错误(你所展示的模型不包含属性DataTurno ),它的确是@Html.ValidationMessageFor(m => m.StartFieldDate, ..)

因为日期时间的默认格式是mm / dd / yyyy。 您的日期考虑为一个月,然后它给出了您需要添加文化格式的错误。

  CultureInfo culture = (CultureInfo)CultureInfo.CurrentCulture.Clone(); culture.DateTimeFormat.ShortDatePattern = "dd/MM/yyyy"; Thread.CurrentThread.CurrentCulture = culture; Thread.CurrentThread.CurrentUICulture = culture; 

并在你的js文件中,你实现了datepicker包含的代码

 jQuery.validator.methods["date"] = function (value, element) { return true; } 

我有同样的问题现在对我来说很好,我希望它能帮到你。

看起来像错误的jQuery datepicker的日期格式,如@ataravati提到。

尝试使用dateFormat选项初始化datepicker,如下所示:

 $(".datepicker").datepicker({ dateFormat: 'dd/mm/yyyy' }); 

在init之后调试或设置dateFormat选项,如下所示:

 //this how to get what is it now var dateFormat = $(".datepicker").datepicker("option", "dateFormat"); //set right format $(".datepicker").datepicker("option", "dateFormat", "dd/mm/yyyy"); 

对我来说,只需要使用此代码来覆盖默认的Jquery日期时间validation:

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