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