From 5c0f406c197f5d27f919165c9260f1962beda886 Mon Sep 17 00:00:00 2001 From: Furkan Evran Date: Fri, 14 Jun 2024 15:41:20 +0300 Subject: [PATCH] Fix criteria DateTimeOffset and DateTime JSON parsing (#7180) * fix criteria json parsing not trying to convert datetimeoffset and datetime * handle array of items in criteria * add convert value override to DateTimeOffsetField that tries to parse it as DateTimeOffset isn't extending IConvertible revert CriteriaJsonConverter --- .../Criteria/CriteriaJsonConverter.cs | 2 +- .../FieldTypes/DateTimeOffsetField.cs | 35 +++++++++++++++++++ .../FieldTypes/GenericValueField.cs | 10 +++--- 3 files changed, 40 insertions(+), 7 deletions(-) diff --git a/src/Serenity.Net.Data/Criteria/CriteriaJsonConverter.cs b/src/Serenity.Net.Data/Criteria/CriteriaJsonConverter.cs index 33fbf057b3..cec82c275b 100644 --- a/src/Serenity.Net.Data/Criteria/CriteriaJsonConverter.cs +++ b/src/Serenity.Net.Data/Criteria/CriteriaJsonConverter.cs @@ -126,7 +126,7 @@ private BaseCriteria Parse(JsonElement[] array) throw new ArgumentNullException("item"); if (item.ValueKind == JsonValueKind.String) - list.Add(item.GetString()); + list.Add(item.GetString()); else if (item.ValueKind == JsonValueKind.Number) list.Add(item.GetDouble()); else if (item.ValueKind == JsonValueKind.True) diff --git a/src/Serenity.Net.Entity/FieldTypes/DateTimeOffsetField.cs b/src/Serenity.Net.Entity/FieldTypes/DateTimeOffsetField.cs index 22dd6b9ced..fadb76e8c8 100644 --- a/src/Serenity.Net.Entity/FieldTypes/DateTimeOffsetField.cs +++ b/src/Serenity.Net.Entity/FieldTypes/DateTimeOffsetField.cs @@ -36,6 +36,41 @@ public static DateTimeOffsetField Factory(ICollection collection, string return new DateTimeOffsetField(collection, name, caption, size, flags, getValue, setValue); } + /// + /// Converts the value. + /// + /// The source. + /// The provider. + /// + public override object ConvertValue(object source, IFormatProvider provider) + { + if (source is Newtonsoft.Json.Linq.JValue jValue) + source = jValue.Value; + + if (source == null) + return null; + + if (source is DateTime dt) + return dt; + + if (source is DateTimeOffset dto) + return dto.DateTime; + + if (source is string s) + { + if (DateTimeOffset.TryParse(s, provider, DateTimeStyles.None, out var dtOffset)) + return dtOffset; + + if (s.TryParseISO8601DateTime(out var dateTime)) + return dateTime; + + if (DateTime.TryParse(s, provider, DateTimeStyles.None, out dateTime)) + return dateTime; + } + + return Convert.ChangeType(source, typeof(DateTime), provider); + } + /// /// Gets field value from a data reader. /// diff --git a/src/Serenity.Net.Entity/FieldTypes/GenericValueField.cs b/src/Serenity.Net.Entity/FieldTypes/GenericValueField.cs index 0c57f7e112..4ab9e70090 100644 --- a/src/Serenity.Net.Entity/FieldTypes/GenericValueField.cs +++ b/src/Serenity.Net.Entity/FieldTypes/GenericValueField.cs @@ -42,13 +42,11 @@ public override object ConvertValue(object source, IFormatProvider provider) if (source == null) return null; - else - { - if (source is TValue val) - return val; - return Convert.ChangeType(source, typeof(TValue), provider); - } + if (source is TValue val) + return val; + + return Convert.ChangeType(source, typeof(TValue), provider); } ///