.NET Core DateTime?如果为null,则ModelState字段无效

时间:2018-12-04 20:42:22

标签: c# datetime asp.net-core .net-core modelstate

我在模型中声明了一个字段:

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

1 个答案:

答案 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,一切正常。