FluentValidation rule for multiple properties

前端 未结 4 1345
难免孤独
难免孤独 2021-01-01 08:26

I have a FluentValidator that has multiple properties like zip and county etc. I want to create a rule that takes two properties just like a RuleFor construct



        
相关标签:
4条回答
  • 2021-01-01 08:59

    What about:

    RuleFor(m => new {m.CountyId, m.Zip}).Must(x => ValidZipCounty(x.Zip, x.CountyId))
                                          .WithMessage("Wrong Zip County");
    
    0 讨论(0)
  • 2021-01-01 09:02

    In my case I needed to mark a property as required (x.RequiredProperty in the example below) if another property was not null (x.ParentProperty in the example below). I ended up using the When syntax:

    RuleFor(x => x.RequiredProperty).NotEmpty().When(x => x.ParentProperty != null);
    

    Or if you have more then one rule for a common when clause you can write it as follows:

    When(x => x.ParentProperty != null, () =>
    {
        RuleFor(x => x.RequiredProperty).NotEmpty();
        RuleFor(x => x.OtherRequiredProperty).NotEmpty();
    });
    

    The definition of the When syntax is the following:

    /// <summary>
    /// Defines a condition that applies to several rules
    /// </summary>
    /// <param name="predicate">The condition that should apply to multiple rules</param>
    /// <param name="action">Action that encapsulates the rules.</param>
    /// <returns></returns>
    public IConditionBuilder When (Func<T, bool> predicate, Action action);
    
    0 讨论(0)
  • 2021-01-01 09:05

    Just came across this old question and I think I have a simpler answer. You can easily pass your whole object into your custom validation rule by simplifying the parameter to RuleFor e.g.

    RuleFor(m => m).Must(fooArgs =>
        ValidZipCounty(fooArgs.Zip, fooArgs.countyId))
        .WithMessage("wrong Zip County");
    

    If the ValidZipCountry method is local to your validator and you can change its signature to take a FooArgs then the code simplifies down to

    RuleFor(m => m).Must(ValidZipCounty).WithMessage("wrong Zip County");
    

    The only downside is that the PropertyName in the resultant validation error will be an empty string. This may cause a problem for you validation display code. However it is not really clear which property the error belongs too, ContryId or Zip, so this does make sense.

    0 讨论(0)
  • 2021-01-01 09:18

    There is a Must overload that also provides you with the FooArgs object documented here. It allows you to easily pass both arguments into your method like this:

    RuleFor(m => m.CountyId).Must((fooArgs, countyId) =>
        ValidZipCounty(fooArgs.Zip, countyId))
        .WithMessage("wrong Zip County");
    
    0 讨论(0)
提交回复
热议问题