【发布时间】:2022-02-17 01:48:11
【问题描述】:
我试图在 .NET 6 中使用新的 DateOnly 类型,但在模型绑定方面遇到了问题。一个完全正常的形式数据,例如:
被解析为“0001.01.01”并被活页夹接受为有效。
用旧的DateTime 替换所有DataOnly 立即解决了这个问题。
这可能是 BCL 中的错误,还是我在这里遗漏了一些意图?除了实现自定义模型绑定器之外,还有其他解决方法吗?
【问题讨论】:
我试图在 .NET 6 中使用新的 DateOnly 类型,但在模型绑定方面遇到了问题。一个完全正常的形式数据,例如:
被解析为“0001.01.01”并被活页夹接受为有效。
用旧的DateTime 替换所有DataOnly 立即解决了这个问题。
这可能是 BCL 中的错误,还是我在这里遗漏了一些意图?除了实现自定义模型绑定器之外,还有其他解决方法吗?
【问题讨论】:
完全绑定支持 DateOnly 和 TimeOnly isn't available yet。另一个相关问题是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 提供了完整的绑定支持,代码将不会有太大变化,除非我可以在没有注释的情况下生存。
【讨论】: