c# - .NET 核心日期时间?如果为 null,则字段 ModelState 无效

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

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

[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)]
public DateTime? dataCreazione { get; set; }

在 View 中,我使用助手渲染字段:

@Html.EditorFor(m => m.dataCreazione )

当我提交带有 dataCreazione null 的表单(通过 js - 表单序列化)时,通过调试我在 Controller 方法中看到 dataCreazione 字段值为 null(正确),但是 ModelState 无效并显示消息(“dataCreazione 应该格式化。 ……”)。

为什么要在可为 null 的 DateTime 上进行验证?我怎样才能避免它?我希望能够在不使模型状态无效的情况下提交 DateTime null。

编辑: 我通过 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 提交了一个日期为空的表单,并且在服务器端,日期时间被初始化为 01/01/0001(并且模型状态有效)。

我只是不提示为什么我不能提交一个 datetime null 并收到一个无效的 modelstate。

最佳答案

我现在刚刚在 .net Core 2.2 上遇到了这个问题(我的项目实际上可能是在去年问这个问题的时候在 2.1 中创建的)。

我的解决方案是更改我在标签助手之外创建的 selectlist 选项(没有值):

<option>Please select one</option>

成为:

<option value="">Please select one</option>

这也不明显,因为 null 值被传回应该有效的 Controller 。它仅在表单错误中很明显:

The value "Please select one" is not valid for...

现在在调试时,传递回 Controller 的模型看起来相同(根据 VS2017),但 ModelState.IsValid 的计算结果为 true 并且一切都按预期工作。

关于c# - .NET 核心日期时间?如果为 null,则字段 ModelState 无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53621092/

相关文章:

c# - 如何更新 foreach 循环中数据表中列的值?

c# - 如何在 Wpf-app 中使用 9-patch 图像

python - timedelta 秒组件不支持的类型 : numpy. int64

asp.net-core - 使用Moq进行ASP.NET核心集成测试和模拟

c# - linux dd命令的Windows C#实现

c# - WPF - 获取控件的位置不断返回 {0;0}

python - 从Python中的SQL查询中选择时间戳

python - Pandas :如何从周和年创建日期时间对象?

c# - 如何同时返回自定义 HTTP 状态码和内容?

azure - 获取访问 token - ASP Net Core 2.x webapp(工作或学校帐户)