From fb19050c757b92deb5f0e718f985aa85fb8c3593 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andrej=20=C4=8Ci=C5=BEm=C3=A1rik?= Date: Tue, 17 Jan 2023 10:51:01 +0100 Subject: [PATCH 1/4] Fixed breaking change for BusinessPack --- src/Framework/Framework/Controls/Validator.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Framework/Framework/Controls/Validator.cs b/src/Framework/Framework/Controls/Validator.cs index ffa5183f40..dd55a55214 100644 --- a/src/Framework/Framework/Controls/Validator.cs +++ b/src/Framework/Framework/Controls/Validator.cs @@ -99,7 +99,9 @@ private static void AddValidatedValue(IHtmlWriter writer, IDotvvmRequestContext } else { - throw new DotvvmControlException($"Could not resolve {nameof(ValueProperty)} to a valid value binding."); + // Could not resolve ValueProperty to a valid value binding + // Note: this can sometimes happen when using AutomaticValidation in BusinessPack + writer.AddKnockoutDataBind(validationDataBindName, control, ValueProperty, renderEvenInServerRenderingMode: true); } // render options From 3434395f067f077e9ef266cf9753fcaeae1c2755 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andrej=20=C4=8Ci=C5=BEm=C3=A1rik?= Date: Tue, 17 Jan 2023 13:39:24 +0100 Subject: [PATCH 2/4] Added support for `DateOnly` and `TimeOnly` types in serializability analysis --- .../Serializability/ViewModelSerializabilityTest.cs | 2 ++ .../Analyzers.Tests/Verifiers/CSharpAnalyzerVerifier`1.cs | 1 + src/Analyzers/Analyzers/Serializability/TypeSymbolExtensions.cs | 2 ++ 3 files changed, 5 insertions(+) diff --git a/src/Analyzers/Analyzers.Tests/Serializability/ViewModelSerializabilityTest.cs b/src/Analyzers/Analyzers.Tests/Serializability/ViewModelSerializabilityTest.cs index 1dda07a9a2..5c1baae28a 100644 --- a/src/Analyzers/Analyzers.Tests/Serializability/ViewModelSerializabilityTest.cs +++ b/src/Analyzers/Analyzers.Tests/Serializability/ViewModelSerializabilityTest.cs @@ -194,6 +194,8 @@ public class DefaultViewModel : DotvvmViewModelBase public object Object { get; set; } public string String { get; set; } public DateTime DateTime { get; set; } + public DateOnly DateOnly { get; set; } + public TimeOnly TimeOnly { get; set; } public TimeSpan TimeSpan { get; set; } public Guid Guid { get; set; } } diff --git a/src/Analyzers/Analyzers.Tests/Verifiers/CSharpAnalyzerVerifier`1.cs b/src/Analyzers/Analyzers.Tests/Verifiers/CSharpAnalyzerVerifier`1.cs index ec023f834b..f4ffa04877 100644 --- a/src/Analyzers/Analyzers.Tests/Verifiers/CSharpAnalyzerVerifier`1.cs +++ b/src/Analyzers/Analyzers.Tests/Verifiers/CSharpAnalyzerVerifier`1.cs @@ -29,6 +29,7 @@ public static async Task VerifyAnalyzerAsync(string source, params DiagnosticRes var test = new Test { TestCode = source, + ReferenceAssemblies = ReferenceAssemblies.Net.Net60 }; test.ExpectedDiagnostics.AddRange(expected); diff --git a/src/Analyzers/Analyzers/Serializability/TypeSymbolExtensions.cs b/src/Analyzers/Analyzers/Serializability/TypeSymbolExtensions.cs index 56a6f27384..eec4672a3a 100644 --- a/src/Analyzers/Analyzers/Serializability/TypeSymbolExtensions.cs +++ b/src/Analyzers/Analyzers/Serializability/TypeSymbolExtensions.cs @@ -82,6 +82,8 @@ private static ImmutableHashSet CreateTypesCache(Compilation compilatio cacheBuilder.Add(compilation.GetTypeByMetadataName("System.Guid")!); cacheBuilder.Add(compilation.GetTypeByMetadataName("System.TimeSpan")!); cacheBuilder.Add(compilation.GetTypeByMetadataName("System.DateTimeOffset")!); + cacheBuilder.Add(compilation.GetTypeByMetadataName("System.DateOnly")!); + cacheBuilder.Add(compilation.GetTypeByMetadataName("System.TimeOnly")!); return cacheBuilder.ToImmutableHashSet(SymbolEqualityComparer.Default); } From 73d4261f8158802bf813f37117dd2263c45ed0cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Standa=20Luke=C5=A1?= Date: Wed, 18 Jan 2023 12:28:22 +0100 Subject: [PATCH 3/4] Fix type metadata cache --- .../ViewModel/Serialization/ViewModelTypeMetadataSerializer.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Framework/Framework/ViewModel/Serialization/ViewModelTypeMetadataSerializer.cs b/src/Framework/Framework/ViewModel/Serialization/ViewModelTypeMetadataSerializer.cs index 270b567537..3cc4fc524e 100644 --- a/src/Framework/Framework/ViewModel/Serialization/ViewModelTypeMetadataSerializer.cs +++ b/src/Framework/Framework/ViewModel/Serialization/ViewModelTypeMetadataSerializer.cs @@ -86,7 +86,7 @@ private JObject GetEnumTypeMetadataCopy(Type type) private ObjectMetadataWithDependencies GetObjectTypeMetadataCopy(ViewModelSerializationMap map) { var key = new ViewModelSerializationMapWithCulture(map, CultureInfo.CurrentUICulture.Name); - var obj = cachedObjectMetadata.GetOrAdd(key, BuildObjectTypeMetadata(map)); + var obj = cachedObjectMetadata.GetOrAdd(key, _ => BuildObjectTypeMetadata(map)); return new ObjectMetadataWithDependencies((JObject)obj.Metadata.DeepClone(), obj.DependentObjectTypes, obj.DependentEnumTypes); } From 0ee2368519be704390c87804f03961bd2f972e75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andrej=20=C4=8Ci=C5=BEm=C3=A1rik?= Date: Wed, 18 Jan 2023 14:49:01 +0100 Subject: [PATCH 4/4] Removed unnecessary data-bind and added check for hard-coded values --- src/Framework/Framework/Controls/Validator.cs | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/Framework/Framework/Controls/Validator.cs b/src/Framework/Framework/Controls/Validator.cs index dd55a55214..b824115b28 100644 --- a/src/Framework/Framework/Controls/Validator.cs +++ b/src/Framework/Framework/Controls/Validator.cs @@ -99,9 +99,15 @@ private static void AddValidatedValue(IHtmlWriter writer, IDotvvmRequestContext } else { - // Could not resolve ValueProperty to a valid value binding - // Note: this can sometimes happen when using AutomaticValidation in BusinessPack - writer.AddKnockoutDataBind(validationDataBindName, control, ValueProperty, renderEvenInServerRenderingMode: true); + // Note: ValueProperty can sometimes contain null (BusinessPack depends on this behaviour) + // However, it certainly should not contain hard-coded values + + var valueRaw = control.GetValueRaw(ValueProperty); + if (valueRaw != null) + { + // There is a hard-coded value in the ValueProperty + throw new DotvvmControlException($"{nameof(ValueProperty)} can not contain a hard-coded value."); + } } // render options