我在模型中声明了一个字段:
[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)]
public DateTime? dataCreazione { get; set; }
在视图中,我使用助手渲染该字段:
@Html.EditorFor(m => m.dataCreazione )
当我提交dataCreazione为null的表单(通过js-窗体序列化)时,通过调试我在控制器方法中看到dataCreazione字段值为null(正确),但是ModelState对消息无效(“ dataCreazione应该格式化。 ....“)。
为什么要对可为空的DateTime进行验证?我如何避免呢?我想能够提交DateTime null而不使modelstate无效。
编辑: 我通过js提交表单:
$.post(this.form.attr('action'), this.form.serialize(), function (data) {
if (data.url == null) {
_this.modal.find('.modal-content').empty();
_this.modal.find('.modal-content').html(data);
_this.bindEvents();
} else {
window.location.href = data.url;
}
});
如果我打印form.serialize(),我看到参数将被发送为dataCreazione =。 在另一个应用程序中,我通过Http GET提交了一个日期为null的表单,并且在服务器端,日期时间用01/01/0001初始化(并且modelstate有效)。
我只是不抱怨为什么我不能提交datetime null并收到无效的modelstate。
答案 0 :(得分:0)
我现在在.net Core 2.2上遇到了这个问题(我的项目可能实际上是在去年提出该问题时在2.1中创建的。)
对我来说,解决方案是更改我在标记助手之外创建的selectlist
选项(无值):
<option>Please select one</option>
成为:
<option value="">Please select one</option>
这也不是很明显,因为null
值正在传递回应该是有效的控制器。仅在形式错误中很明显:
“请选择一个”值不适用于...
现在,在调试时,传递回控制器的模型看起来相同(根据VS2017),但是ModelState.IsValid
的计算结果为true
,一切正常。