如果提交的空日期默认为默认值,为什么 ModelState 无效?

Why is ModelState invalid if a submitted empty date defaults to default value?

我有一个视图,我可以在其中加载表单来更新用户。当我用要在页面上显示的数据填充我的视图模型 UpdateUserViewModel 时,UserModel 上的 Info 属性 为空。这是意料之中的,因为数据库中根本没有它的记录,因此不会检索到它。但是,我仍然为其两个属性添加隐藏字段,因为当我 post 表单时,我希望 Info 属性 使用默认值创建,这确实发生了。

public UpdateUserViewModel {
    public UserModel User { get; set; }
}
    
public class UserModel
{
    public int Id { get; set; }
    public string Name { get; set; }
    public InfoModel Info { get; set; }
}

public class InfoModel {
    public DateTime InfoDate { get; set; }
    public string ConcurrencyToken { get; set; }
}

发布表单导致 ModelState.IsValid 对于 InfoModel 上的 InfoDate 属性 是错误的。它给出了错误消息 The value '' is invalid。但这没有意义,因为当我检查 posted 模型的 InfoDate 值时,我看到它是默认的最小日期 1/1/0001 12:00:00 AM.

我考虑过让 InfoDate 可以为空,但这没有意义,因为我需要将此 属性 映射到业务层模型并将其设置为默认值无论如何约会。我也不明白为什么它在明显默认为一个值时显示该错误。

当我看到表单提交的空日期已成功默认为 1/1/0001 12:00:00 AM 时,为什么我会得到 The value '' is invalid?我该如何解决这个问题?

我在想,也许它正在专门查看用户在该字段中设置的值,而不是 属性 的最终值?但如果是这样,它为什么会在乎呢?我在 InfoDate 上没有任何验证属性,例如 [Required].

在客户端绑定数据时,它会先从 ModelState 中获取值,然后再从 Model 中获取值。尝试在检查 ModelState.And 之前添加 ModelState.Clear()TryValidateModel(xxx) 那么您将无法获取The value '' is invalid.

ModelState.Clear();
TryValidateModel(MyProperty);
var IsValid=ModelState.IsValid;