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に渡します。これを達成するための最良の方法は何ですか?
文書化されたMust
オブジェクトを提供するFooArgs
オーバーロードがあります here 。次のように、両方の引数をメソッドに簡単に渡すことができます。
RuleFor(m => m.CountyId).Must((fooArgs, countyId) =>
ValidZipCounty(fooArgs.Zip, countyId))
.WithMessage("wrong Zip County");
この古い質問に出くわしただけで、もっと簡単な答えがあると思います。パラメータを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
も明確ではないため、これは意味があります。
何について:
RuleFor(m => new {m.CountyId, m.Zip}).Must(x => ValidZipCounty(x.Zip, x.CountyId))
.WithMessage("wrong Zip County");
私の場合、プロパティを必須としてマークする必要がありました(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);