ASP.NET Core 6 MVC 中的 DateOnly 绑定问题

Problem binding DateOnly in ASP.NET Core 6 MVC

我试图在 .NET 6 中使用新的 DateOnly 类型,但我在模型绑定方面遇到了问题。一个完全正常的表单数据,例如:

被解析为“0001.01.01”并被活页夹接受为有效。

用旧的 DateTime 替换所有 DataOnly 立即解决了这个问题。

这可能是 BCL 中的错误,还是我在这里遗漏了一些意图?除了实现自定义模型活页夹之外,是否有任何解决方法?

对 DateOnly 和 TimeOnly 的完全绑定支持 isn't available yet. Another related issue is this one。这是为 .NET 7 计划的

第二个问题的解决方法是创建自定义 JsonConverter 和 TypeConverter。第二期的作者已经将两者打包在 DateOnlyTimeOnly.AspNet

如之前的回答所述,DateOnly 尚不提供完整的绑定支持。但是,我遇到了类似的问题,并且能够使用 DataType 注释解决这个问题。

我正在使用只需要日期的 API 并且不想经历从 DateTime 获取日期的麻烦(虽然这不是很麻烦,但仍然......) .

这是我模型上的 属性,我用来根据从 API 返回的数据构建对象:

[DataType(DataType.Date)]
public DateTime DateBecameLead { get; init; }

这是我 Index.cshtml.cs 上的 属性,我用来按日期过滤机会卡列表。:

[ BindProperty(SupportsGet = true), DataType(DataType.Date) ]
public DateTime DateBecameLead { get; init; } = new (2021, 1, 1);

然后,再往下Index.cshtml.cs,我可以很容易地比较这两个属性:

OpportunityCards = OpportunityCards.Where(opp => opp.DateBecameLead >= DateBecameLead).ToList();

关于进一步的上下文,这里是 Index.cshtml 上的输入标签,它绑定到来自 Index.cshtml.cs 的 属性:

<input id="date-became-lead"
       type="date"
       asp-for="DateBecameLead" />

它仍在使用旧的 DateTime 对象,但是,它确实提供了与使用 DateOnly 对象相同的好处,并且按预期工作。一旦为 DateOnly 提供了完整的绑定支持,代码将不会有太大变化,除非我可以在没有注释的情况下生活。