【问题标题】:DateOnly & TimeOnly Web API .NET 6DateOnly 和 TimeOnly Web API .NET 6
【发布时间】:2023-01-11 16:32:58
【问题描述】:

我在将 .Net 6 中的 DateOnly 和 TimeOnly 值发送​​到数据库时遇到困难。

关于这个问题,我在这里阅读了多个答案,并且都尝试过了,但仍然显示错误 400

这是我制作的转换器

 public class DateOnlyJsonConverter : JsonConverter<DateOnly>
    {
      
        public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
        {
            var value = reader.GetString();

            return DateOnly.Parse(value!);
        }

        public override void Write(Utf8JsonWriter writer, DateOnly value, JsonSerializerOptions options)
        {
            writer.WriteStringValue(value.ToString("yyyy-MM-dd"));
        }

暂时的

public class TimeOnlyJsonConverter : JsonConverter<TimeOnly>
    {
        public override TimeOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
        {
            var value = reader.GetString();

            return TimeOnly.Parse(value!); 
        }

        public override void Write(Utf8JsonWriter writer, TimeOnly value, JsonSerializerOptions options)
        {
            writer.WriteStringValue(value.ToString("HH:mm:ss.fff"));
        }
    }

我还在 program.cs 上添加了这个

builder.Services.AddControllers().AddJsonOptions(
    options =>
    {
        options.JsonSerializerOptions.Converters.Add(new DateOnlyJsonConverter());
        options.JsonSerializerOptions.Converters.Add(new TimeOnlyJsonConverter());
    }

这是控制器上的代码

    [HttpPost]
            public async Task<IActionResult> CheckIn(Absensi request)
            {
                 var absensis = new Absensi()
                {
                    IDKaryawan = request.IDKaryawan,
                    NamaKaryawan = request.NamaKaryawan,
                    IDPerusahaan = request.IDKaryawan,
                    NamaPerusahaan = request.NamaKaryawan,
                     Tanggal = DateOnly.FromDateTime(DateTime.Now),
                    WaktuCheckIn = TimeOnly.FromDateTime(DateTime.Now),
                   // WaktuCheckOut = TimeOnly.FromDateTime(DateTime.Now),
                    BluetoothId = request.BluetoothId,
                    AlamatLatitude = request.AlamatLatitude,
                    AlamatLongtitude = request.AlamatLongtitude,
                    Telat = request.Telat,
                 };
                await _context.Absensis.AddAsync(absensis);
                await _context.SaveChangesAsync();
                return Ok("Absensi Created!");
            }

然而,当它通过 swagger 执行时仍然显示错误 400

{ 
 "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
 "title": "One or more validation errors occurred.",
 "status": 400,
 "traceId": "00-6756849f7366cabf4b0d7d8289fc4173-53ac44cc08885df5-00",
 "errors": {
        "request": [
        "The request field is required."
       ],
"$.tanggal": [
  "The JSON value could not be converted to System.DateOnly. Path: $.tanggal | LineNumber: 5 | BytePositionInLine: 14."
  ]
 }
}

error 400 swagger

请让我知道我做了什么以及如何解决它。谢谢你

【问题讨论】:

  • 如果我没记错的话,您需要修改 Absensi 类型并添加一个属性以指定将使用您的转换器解析 DateOnly 属性
  • @PabloRecalde 您是指 Absensi 模型还是数据库上下文?如果你能指导我如何去做,我将不胜感激,因为我还没有找到任何相关信息。谢谢,麻烦您了。

标签: asp.net-mvc asp.net-core asp.net-web-api .net-6.0 dateonly


【解决方案1】:

我认为您缺少告诉 Json 解析器对该属性使用特定转换器的属性。

Absensi类型上,需要像这样装饰DateOnly类型的属性:

public class Absensi 
{
    [JsonConverter(typeof(DateOnlyJsonConverter))]
    public DateOnly MyDateOnlyProperty { get; set; }
    ...
}

【讨论】:

  • 非常感谢,我添加了,但它仍然显示相同的错误。
猜你喜欢
  • 2021-12-16
  • 1970-01-01
  • 1970-01-01
  • 2022-12-08
  • 2019-10-03
  • 2023-01-07
  • 1970-01-01
  • 2021-12-29
  • 1970-01-01
相关资源
最近更新 更多