2015-02-05 129 views
0

在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.

我没有弄清楚是什么问题,因为所有的控制都产生相同办法。

+0

哪里是你的jQuery日期选择器?这很可能是因为你的jQuery datepicker的日期格式。 – ataravati 2015-02-05 17:06:30

+0

另外,在你的View中你可以用'EditorFor'来代替'DataTurno'的'model.StartFieldDate'和'ValidationMessageFor'。 – 2015-02-05 17:11:27

回答

0

似乎错了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"); 
2

有许多潜在的的问题。

首先,将[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, ..)

1

因为日期时间默认格式是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; } 

我有同样的问题,现在工作对我很好,我希望它可以帮助你。

0

对我来说,只是有这样的代码来ovewrite默认Jquery的日期时间验证:

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