diff --git a/src/FluentValidation.Tests/ChainedValidationTester.cs b/src/FluentValidation.Tests/ChainedValidationTester.cs index 612f21e10..3796852a9 100644 --- a/src/FluentValidation.Tests/ChainedValidationTester.cs +++ b/src/FluentValidation.Tests/ChainedValidationTester.cs @@ -114,8 +114,7 @@ public class ChainedValidationTester { [Fact] public void Separate_validation_on_chained_property() { var validator = new DepartmentValidator(); - var result = validator.Validate(new Department - { + var result = validator.Validate(new Department { Manager = new Person(), Assistant = new Person() }); @@ -171,7 +170,7 @@ public class ChainedValidationTester { var validator = new InlineValidator(); validator.RuleFor(x => x.Address).SetValidator(addressValidator, ruleSets: "ruleset1"); - var result = validator.Validate(new Person {Address = new Address()}); + var result = validator.Validate(new Person { Address = new Address() }); result.Errors.Count.ShouldEqual(1); result.Errors[0].PropertyName.ShouldEqual("Address.Line1"); } diff --git a/src/FluentValidation.Tests/ChildRulesTests.cs b/src/FluentValidation.Tests/ChildRulesTests.cs index 36308c71a..f6851eb38 100644 --- a/src/FluentValidation.Tests/ChildRulesTests.cs +++ b/src/FluentValidation.Tests/ChildRulesTests.cs @@ -19,6 +19,7 @@ #endregion namespace FluentValidation.Tests { + using FluentValidation.Results; using System.Collections.Generic; using Xunit; @@ -33,11 +34,13 @@ public class ChildRulesTests { order.RuleFor(x => x.Amount).GreaterThan(0); }); - var result = validator.Validate(new Person {Orders = new List { + var result = validator.Validate(new Person { + Orders = new List { new Order { ProductName = null, Amount = 10 }, new Order { ProductName = "foo", Amount = 0}, new Order { ProductName = "foo", Amount = 10 } - }}); + } + }); result.Errors.Count.ShouldEqual(2); result.Errors[0].PropertyName.ShouldEqual("Orders[0].ProductName"); @@ -71,7 +74,24 @@ public class ChildRulesTests { result.Errors.Count.ShouldEqual(0); } - private class RulesetChildRulesValidator : AbstractValidator { + [Fact] + public void ChildRules_works_with_SetValidator_and_RuleSet() { + var validator = new RulesetChildValidatorRulesValidator(); + + // If the validator inside a child rule specifies a rule set "b", + // the rules inside the rule set "b" should not be used for the validation + // if the validation context specified the ruleset "a" + var result = validator.Validate(new Person { + Orders = new List { + new Order() + } + }, options => options.IncludeRuleSets("a")); + + result.Errors.Count.ShouldEqual(1); + result.Errors[0].PropertyName.ShouldEqual("Surname"); + } + + private class RulesetChildRulesValidator : AbstractValidator { public RulesetChildRulesValidator() { RuleSet("testing", () => { RuleFor(a => a.Surname).NotEmpty(); @@ -81,5 +101,26 @@ private class RulesetChildRulesValidator : AbstractValidator { }); } } + + private class RulesetChildValidatorRulesValidator : AbstractValidator { + public RulesetChildValidatorRulesValidator() { + RuleSet("a, b", () => { + RuleFor(x => x.Surname).NotEmpty(); + RuleFor(x => x).ChildRules(child => { + child.RuleForEach(o => o.Orders).SetValidator(new RulesetOrderValidator()); + }); + }); + } + + private class RulesetOrderValidator : AbstractValidator { + public RulesetOrderValidator() { + RuleSet("b", () => { + RuleFor(o => o.ProductName).NotEmpty(); + }); + } + } + } + } } + diff --git a/src/FluentValidation/DefaultValidatorExtensions.cs b/src/FluentValidation/DefaultValidatorExtensions.cs index 3096ab40c..26418a1da 100644 --- a/src/FluentValidation/DefaultValidatorExtensions.cs +++ b/src/FluentValidation/DefaultValidatorExtensions.cs @@ -1169,8 +1169,14 @@ public static partial class DefaultValidatorExtensions { public static IRuleBuilderOptions ChildRules(this IRuleBuilder ruleBuilder, Action> action) { if (action == null) throw new ArgumentNullException(nameof(action)); var validator = new InlineValidator(); + var ruleSets = DefaultValidatorOptions.Configurable(ruleBuilder).RuleSets; action(validator); - return ruleBuilder.SetValidator(validator, "*"); + foreach(var rule in validator.Rules) { + if (rule.RuleSets == null) { + rule.RuleSets = ruleSets; + } + } + return ruleBuilder.SetValidator(validator); } ///