添加到.NET API的IsoDateTimeConverter中断默认模型绑定

时间:2017-03-22 15:06:09

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

我的.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端点,它接受以下viewmodel:

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

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

{
    dateOfBirth: '1981-04-18'
}

在实现上面的日期转换器之后,我的控制器中的viewmodel等于null。

1 个答案:

答案 0 :(得分:1)

一个快速的解决方案是介绍和使用WriteOnlyIsoDateTimeConverter

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

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

另一种选择可能是替换this question中显示的JsonOutputFormatter