Include member name when constructing ValidationResult in CompareAttribute (#38867)
authorPranav K <prkrishn@hotmail.com>
Fri, 10 Jul 2020 03:40:15 +0000 (20:40 -0700)
committerGitHub <noreply@github.com>
Fri, 10 Jul 2020 03:40:15 +0000 (20:40 -0700)
Fixes https://github.com/dotnet/runtime/issues/29214

src/libraries/System.ComponentModel.Annotations/src/System/ComponentModel/DataAnnotations/CompareAttribute.cs
src/libraries/System.ComponentModel.Annotations/tests/System/ComponentModel/DataAnnotations/CompareAttributeTests.cs

index cb712b0..5b8ab82 100644 (file)
@@ -45,7 +45,10 @@ namespace System.ComponentModel.DataAnnotations
                     OtherPropertyDisplayName = GetDisplayNameForProperty(otherPropertyInfo);
                 }
 
-                return new ValidationResult(FormatErrorMessage(validationContext.DisplayName));
+                string[] memberNames = validationContext.MemberName != null
+                   ? new[] { validationContext.MemberName }
+                   : null;
+                return new ValidationResult(FormatErrorMessage(validationContext.DisplayName), memberNames);
             }
 
             return null;
index a2ccf2d..cfe2b90 100644 (file)
@@ -74,6 +74,34 @@ namespace System.ComponentModel.DataAnnotations.Tests
         }
 
         [Fact]
+        [SkipOnTargetFramework(~TargetFrameworkMonikers.NetFramework)]
+        public static void Validate_IncludesMemberName_NetFx()
+        {
+            ValidationContext validationContext = new ValidationContext(new CompareObject("a"));
+            validationContext.MemberName = nameof(CompareObject.CompareProperty);
+            CompareAttribute attribute = new CompareAttribute(nameof(CompareObject.ComparePropertyCased));
+
+            ValidationResult validationResult = attribute.GetValidationResult("b", validationContext);
+
+            Assert.NotNull(validationResult.ErrorMessage);
+            Assert.Empty(validationResult.MemberNames);
+        }
+
+        [Fact]
+        [SkipOnTargetFramework(TargetFrameworkMonikers.NetFramework)]
+        public static void Validate_IncludesMemberName_Netcoreapp()
+        {
+            ValidationContext validationContext = new ValidationContext(new CompareObject("a"));
+            validationContext.MemberName = nameof(CompareObject.CompareProperty);
+            CompareAttribute attribute = new CompareAttribute(nameof(CompareObject.ComparePropertyCased));
+
+            ValidationResult validationResult = attribute.GetValidationResult("b", validationContext);
+
+            Assert.NotNull(validationResult.ErrorMessage);
+            Assert.Equal(new[] { nameof(CompareObject.CompareProperty) }, validationResult.MemberNames);
+        }
+
+        [Fact]
         public static void Validate_PrivateProperty_ThrowsArgumentException()
         {
             CompareAttribute attribute = new CompareAttribute("PrivateProperty");