web-dev-qa-db-ja.com

複数のプロパティのFluentValidationルール

Zipやcountyなどの複数のプロパティを持つFluentValidatorがあります。RuleFor構成のように2つのプロパティを取るルールを作成したい

public class FooArgs
{
    public string Zip { get; set; }
    public System.Guid CountyId { get; set; }
}

public class FooValidator : AbstractValidator<FooArgs>
{
    RuleFor(m => m.CountyId).Must(ValidZipCounty).WithMessage("wrong Zip County");
}

これは機能しますが、検証するためにZipと郡の両方をrueに渡します。これを達成するための最良の方法は何ですか?

37
Sofia Khwaja

文書化されたMustオブジェクトを提供するFooArgsオーバーロードがあります here 。次のように、両方の引数をメソッドに簡単に渡すことができます。

RuleFor(m => m.CountyId).Must((fooArgs, countyId) =>
    ValidZipCounty(fooArgs.Zip, countyId))
    .WithMessage("wrong Zip County");
39
bpruitt-goddard

この古い質問に出くわしただけで、もっと簡単な答えがあると思います。パラメータをRuleForに簡略化することで、オブジェクト全体をカスタム検証ルールに簡単に渡すことができます。

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

ValidZipCountryメソッドがバリデータに対してローカルであり、その署名を変更してFooArgsを取得できる場合、コードは次のように簡略化されます。

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

唯一の欠点は、結果の検証エラーのPropertyNameが空の文字列になることです。これにより、検証表示コードに問題が発生する可能性があります。ただし、エラーがどのプロパティに属しているか、ContryIdまたはZipも明確ではないため、これは意味があります。

15
Alan Hinton

何について:

RuleFor(m => new {m.CountyId, m.Zip}).Must(x => ValidZipCounty(x.Zip, x.CountyId))
                                     .WithMessage("wrong Zip County");
12
Matías Romero

私の場合、プロパティを必須としてマークする必要がありました(x.RequiredProperty(以下の例))別のプロパティがnullでない場合(x.ParentProperty以下の例で)。私はWhen構文を使用してしまいました:

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

または、共通のwhen句に複数のルールがある場合は、次のように記述できます。

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

When構文の定義は次のとおりです。

/// <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);
1
Francesco D.M.