2

私は流暢なバリデーターを使用することに非常に慣れていません。私は基本的なことしか知りませんが、rulefor()カスタムに関してはまったく無知です。誰でもこれについて私を案内できますか?

null 許容の bool プロパティを検証する必要があります。5 つの bool プロパティを比較する必要があります。それらの少なくとも 1 つが選択されている場合は true を返し、そうでない場合は false を返し、少なくとも 1 つが選択されているというエラー メッセージを表示する必要があります。以下は私が思いついたものですが、機能していません。

public class NullableValidator : AbstractValidator<bool>
{

    public bool isQualificationSet(tblNeutralFileMaint neutral)
    {
        if (neutral.MediationCivil==false && !neutral.CaseEvalCondemnation==false &&        neutral.MediationMagistrate==false && neutral.CaseEvalTorts==false && neutral.CaseEvalDomesticViolence==false)
            return false;
        else return true;
    }
} 

私はこれを次のように使用しました:

RuleFor(n => n.IsQualificationSet).SetValidator(new NullableValidator());

誰でも方法を教えてもらえますか? これに数時間取り組んでいます。エラーは表示されませんが、機能しないか、メソッドに移動しません。

4

3 に答える 3

4

あなたがやろうとしていることを完全に理解しているとは言えません。IsQualificationSet プロパティが true に設定されている場合にのみ、このルールを実行しますか? IsQualificationSet と他のプロパティの関係がわかりません。


いずれにしても、カスタム プロパティ バリデータを作成する場合は、PropertyValidator 基本クラスから継承する必要があります (AbstractValidator はトップ レベルのオブジェクトを検証するためのものです)。これに関するドキュメントは FV wiki にあります)。

したがって、カスタム プロパティ バリデータは次のようになります。

public class QualificationSetValidator : PropertyValidator {
    // Default error message specified in the base ctor
    // but it can be overriden using WithMessage in the RuleFor call
    public QualificationSetValidator() : base("At least one property must be selected.") {

    }

    protected override bool IsValid(PropertyValidatorContext context) {
        // You can retrieve a reference to the object being validated 
        // through the context.Instance property
        tblNeutralFileMaint neutral = (tblNeutralFileMaint)context.Instance;

        // You can also retrieve a reference to the property being validated
        // ...using context.PropertyValue

        // here is where you can do the custom validation
        // and return true/false depending on success.

     }
 }

カスタム プロパティ バリデータ クラスを定義する代わりに、PredicateValidator ('Must' メソッド) を使用してカスタム ルールをインラインで定義することもできます。これは、カスタム ロジックが単純な場合に適した方法です。これについての詳細はドキュメントにもあります

于 2011-07-16T11:08:47.763 に答える
2

ジェレミーの答えに基づいて、私の実用的な答えを投稿させてください。

public class NeutralFileValidator  : AbstractValidator<tblNeutralFileMaint>
{
   public NeutralFileValidator()
   {
       RuleFor(neutral => neutral.NeutralID).NotNull();
       RuleFor(neutral => neutral.FirstName).NotNull().NotEmpty();
       RuleFor(neutral => neutral.IsQualificationSet).SetValidator(new QualificationSetValidator<tblNeutralFileMaint>());
   }
}

public class QualificationSetValidator<T> : PropertyValidator
{
    public QualificationSetValidator()
        : base("Please check at least One Qualification type.")
    {

    }

    protected override bool IsValid(PropertyValidatorContext context)
    {

        tblNeutralFileMaint neutral = (tblNeutralFileMaint)context.Instance;
        if (neutral.MediationCivil.HasValue && neutral.MediationCivil.Value == false && neutral.MediationDomestic.HasValue && neutral.MediationDomestic.Value == false 
            && neutral.MediationDomesticViolence.HasValue && neutral.MediationDomesticViolence.Value == false && neutral.MediationMagistrate.HasValue && neutral.MediationMagistrate.Value == false
            && neutral.CaseEvalContracts.HasValue && neutral.CaseEvalContracts.Value == false && neutral.CaseEvalCondemnation.HasValue && neutral.CaseEvalCondemnation.Value == false
            && neutral.CaseEvalTaxAppeal.HasValue && neutral.CaseEvalTaxAppeal.Value == false && neutral.CaseEvalEquity.HasValue && neutral.CaseEvalEquity.Value == false
            && neutral.CaseEvalTorts.HasValue && neutral.CaseEvalTorts.Value == false && neutral.CaseEvalZoning.HasValue && neutral.CaseEvalZoning.Value == false
             && neutral.CaseEvalDomestic.HasValue && neutral.CaseEvalDomestic.Value == false && neutral.CaseEvalDomesticViolence.HasValue && neutral.CaseEvalDomesticViolence.Value == false)
            return false;
        else return true;


    }
}
于 2011-07-18T08:17:49.453 に答える