ASP MVC DateTime验证错误

时间:2015-02-05 16:55:49

标签: c# jquery asp.net-mvc jquery-ui jquery-ui-datepicker

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

在视图中,我有:

<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类。

在表单中,如果我点击&#34;创建&#34;按钮,无需修改任何控件,一切正常。 当我更改最后两个datetime选择器中的一个,然后单击&#34;创建&#34;按钮,我收到验证错误:The field xxxx must be a date.

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

5 个答案:

答案 0 :(得分:4)

存在许多潜在问题。

首先,[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中尚未支持(refer comparison

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

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

并在datepicker脚本中设置格式

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

验证消息可能来自两个问题之一。在客户端,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"/>),则可能会在服务器上抛出验证错误,在这种情况下,您需要创建自定义ModelBinder DateTime

附注:我认为@Html.ValidationMessageFor(m => m.DataTurno, ..)是一个拼写错误(您展示的模型不包含属性DataTurno),而且它真的是@Html.ValidationMessageFor(m => m.StartFieldDate, ..)

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

似乎错误的 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");

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

以防万一这发生在其他任何人身上。我最初遇到验证错误,因为我的iOS应用迅速发送了Unix时间。我使用从请求正文读取json的app.using块进行了诊断。然后,我将快速日期更改为iso,但是它不起作用。我花了好几个小时才意识到,一旦诊断代码读取了身体内容,其他什么也无法……所以它会产生验证错误(但现在是出于其他原因)。如果有人碰巧以相同的方式浏览您的内容,请记住将其标记出来。至少在.net core 2.2中,您无法在Body流上进行搜索。