【问题标题】:.NET Core DateTime? field ModelState is invalid if null.NET Core 日期时间?如果为 null,则字段 ModelState 无效
【发布时间】:2019-05-06 08:39:37
【问题描述】:

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

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

编辑: 我通过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(并且模型状态有效)。

我只是没有抱怨为什么我不能提交一个 datetime null 并收到一个无效的模型状态。

【问题讨论】:

  • 你能解释一下为什么吗?文档说数据类型注释仅用于显示,不影响验证模型
  • 我刚刚尝试了您的代码,但未能重现您的问题。 1. 如何提交表格?您能否发布发送到服务器的完整有效负载? 2.另外,最好给我们展示一下服务器端的action方法。
  • 综合题
  • 仍然无法重现。您能否发布您的服务器端代码和发送到服务器的有效负载?
  • 我发现错误,有一个自定义模型绑定器始终验证日期时间。可以关闭了,谢谢。

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


【解决方案1】:

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

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

<option>Please select one</option>

成为:

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

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

“请选择一个”值对...无效。

现在在调试时,传回控制器的模型看起来是一样的(根据 VS2017),但 ModelState.IsValid 的计算结果为 true,一切正常。

【讨论】:

    猜你喜欢
    • 2013-01-19
    • 1970-01-01
    • 1970-01-01
    • 2015-08-09
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 2013-12-14
    • 1970-01-01
    相关资源
    最近更新 更多