【问题标题】:Problem binding DateOnly in ASP.NET Core 6 MVC在 ASP.NET Core 6 MVC 中绑定 DateOnly 的问题
【发布时间】:2022-02-17 01:48:11
【问题描述】:

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

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

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

这可能是 BCL 中的错误,还是我在这里遗漏了一些意图?除了实现自定义模型绑定器之外,还有其他解决方法吗?

【问题讨论】:

    标签: asp.net-core-mvc .net-6.0


    【解决方案1】:

    完全绑定支持 DateOnly 和 TimeOnly isn't available yet。另一个相关问题是this one。这是为 .NET 7 计划的

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

    【讨论】:

    • 好的。谢谢你。然后我会坚持一段时间的 DateTime...
    【解决方案2】:

    如上一个答案所述,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 提供了完整的绑定支持,代码将不会有太大变化,除非我可以在没有注释的情况下生存。

    【讨论】:

      猜你喜欢
      • 2016-03-08
      • 2023-02-22
      • 1970-01-01
      • 2023-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多