As of .NET 6 in ASP.NET API, if you want to get DateOnly (or TimeOnly) as query parameter, you need to separately specify all it's fields instead of just providing a string ("2021-09-14", or "10:54:53" for TimeOnly) like you can for DateTime.
I was able to fix that if they are part of the body by adding adding custom JSON converter (AddJsonOptions(o => o.JsonSerializerOptions.Converters.Add(...))), but it doesn't work for query parameters.
I know that could be fixed with model binder, but I don't want to create a model binder for every model that contains DateOnly/TimeOnly. Is there a way to fix this application wide?
Demo:
Lets assume you have a folowwing action:
[HttpGet] public void Foo([FromQuery] DateOnly date, [FromQuery] TimeOnly time, [FromQuery] DateTime dateTime)
Here's how it would be represented in Swagger:
I want it represented as three string fields: one for DateOnly, one for TimeOnly and one for DateTime (this one is already present).
PS: It's not a Swagger problem, it's ASP.NET one. If I try to pass ?date=2021-09-14 manually, ASP.NET wouldn't understand it.
I also met your issue in my side and it seems the constructor itself doesn't support parameter-less mode. As the code below :
public DateOnly(int year, int month, int day)
{
throw null;
}
[NullableContext(1)]
public DateOnly(int year, int month, int day, Calendar calendar)
{
throw null;
}
While the DateTime supports:
public DateTime Date
{
get
{
throw null;
}
}
Therefore, I'm afraid before some updating on DateOnly and TimeOnly, we all need to use string instead and divide the string into year, month and day and then new DateOnly(int year, int month, int day).