在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.
我不知道问题是什么,因为所有的控件都是以相同的方式生成的。
答案 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流上进行搜索。