ASP MVC日期时间验证错误
在asp.net MVC 5,我有从DTO对象显示数据的一种形式:ASP MVC日期时间验证错误
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;
...
...
}
在视图,我有:
<div class="col-md-10">
@Html.EditorFor(model => model.StartFieldDate, new { htmlAttributes = new { @class = "form-control datepicker" } })
@Html.ValidationMessageFor(model => model.DataTurno, "", new { @class = "text-danger" })
</div>
而且,我有用于其它控制器datetime
相同的剃刀代码。我为jQuery UI DatePicker添加了datepicker
类。
在表单中,如果我点击“创建”按钮,而不修改任何控件,一切正常。 当我改变最后两个datetime
采摘之一,然后点击“创建”按钮,我得到验证错误:The field xxxx must be a date.
我没有弄清楚是什么问题,因为所有的控制都产生相同办法。
似乎错了jQuery datepicker的日期格式像@ataravati提及。
尝试初始化日期选择器与dateFormat
选项,如:
$(".datepicker").datepicker({ dateFormat: 'dd/mm/yyyy' });
获取调试或设置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");
有许多潜在的的问题。
首先,将[DataType(DataType.DateTime)]
和[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:dd/MM/yyyy}")]
属性使用@Html.EditorFor()
并用于呈现的浏览器执行一个HTML5日期选择器(它添加type="date"
属性)时只适用。由于您使用的是jQueryUI datepicker,因此这些属性不是必需的。在任何情况下,如果您确实需要浏览器HTML5日期选择器,则格式需要为DataFormatString = "{0:yyyy-MM-dd}"
(ISO格式)才能正常工作。还要注意的HTML5日期选择器只支持在现代浏览器,并且还没有在所有的火狐(refer comparison)
如果使用jQueryUI的日期选择器那么它可以只是
@Html.TextBoxFor(m => m.StartFieldDate, new { @class = "form-control datepicker" })
,并设置在格式datepicker脚本
$('.datepicker').datepicker({ dateFormat: 'dd/mm/yy' });
验证消息可能来自2个问题之一。在客户端,jquery-validate.js
使用格式MM/dd/yyyy
验证日期。您可以覆盖这个由包括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' });
另一个潜在的问题是服务器端验证。如果服务器文化不接受格式为dd/MM/yyyy
的日期(例如<globalization culture="en-AU" uiCulture="en-AU"/>
),则可能会在服务器上引发验证错误,在这种情况下,您需要为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文件在您执行日期选择器中包括如下代码
jQuery.validator.methods["date"] = function (value, element) { return true; }
我有同样的问题,现在工作对我很好,我希望它可以帮助你。
对我来说,只是有这样的代码来ovewrite默认Jquery的日期时间验证:
$(function() {
$.validator.methods.date = function (value, element) {
return this.optional(element) || moment(value, "L", true).isValid();
}
});
哪里是你的jQuery日期选择器?这很可能是因为你的jQuery datepicker的日期格式。 – ataravati 2015-02-05 17:06:30
另外,在你的View中你可以用'EditorFor'来代替'DataTurno'的'model.StartFieldDate'和'ValidationMessageFor'。 – 2015-02-05 17:11:27