【问题标题】:IsoDateTimeConverter added to .NET API breaks default model binding添加到 .NET API 的 IsoDateTimeConverter 会破坏默认模型绑定
【发布时间】:2023-03-30 19:10:02
【问题描述】:

我的 .NET Core API 出现问题,当 DateTimes 被序列化时,如果值为 0,它将离开毫秒。This 问题解释了这个问题。我在我的 .NET Core Startup 类中添加了以下内容,它解决了这个问题,当我执行GET 时,所有日期的格式都会正确:

services.AddMvc()
    .AddJsonOptions(options =>
    {
        var settings = options.SerializerSettings;
        var dateConverter = new IsoDateTimeConverter
        {
            DateTimeFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss.fff"
        };
        settings.Converters.Add(dateConverter);
    });

在实现这个之后,我发现它破坏了其他地方的默认模型绑定。例如,我有一个接受以下视图模型的POST 端点:

public class PatientRegistrationViewModel
{
    public DateTime DateOfBirth { get; set; }
}

之前我在成功绑定的请求正文中传递了以下 JSON 数据:

{
    dateOfBirth: '1981-04-18'
}

在实现上面的日期转换器后,视图模型在我的控制器中等于 null。

【问题讨论】:

  • 您是否忘记了DateTimeFormat 字符串末尾的'Z'
  • @haindl 不幸的是,这并没有做到。

标签: c# asp.net json api asp.net-core


【解决方案1】:

一个快速的解决方案是引入和使用WriteOnlyIsoDateTimeConverter

public class WriteOnlyIsoDateTimeConverter : IsoDateTimeConverter
{
    public override bool CanRead { get { return false; } }
}

通过覆盖 CanRead 以返回 false,模型绑定器应继续使用当前内置的日期解析,同时使用转换器进行输出格式化。

另一种选择可能是替换JsonOutputFormatter,如this question 所示。

【讨论】:

  • WriteOnlyIsoDateTimeConverter FTW!
猜你喜欢
  • 1970-01-01
  • 2011-01-05
  • 2022-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-22
  • 1970-01-01
  • 1970-01-01
  • 2015-05-27
相关资源
最近更新 更多