изготовленный на заказ fluentvalidator - PullRequest
2 голосов
/ 15 июля 2011

Я очень новичок в использовании fluentvalidator.Все, что я знаю, это базовый rulefor(), но когда дело доходит до обычаев, я совершенно не в курсе.Кто-нибудь может подсказать мне об этом?

Мне нужно проверить свойство обнуляемого bool.Мне нужно сравнить 5 свойств bool, если хотя бы одно из них выбрано, тогда оно должно возвращать true и в противном случае оно должно возвращать false и выводить сообщение об ошибке, что хотя бы одно из них выбрано.ниже приводится то, что я придумал, но не работал.

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());

Может кто-нибудь сказать мне, как?Работаю над этим уже несколько часов.Это не показывает никакой ошибки, но не работает или не идет к методу.

Ответы [ 3 ]

4 голосов
/ 16 июля 2011

Я не совсем уверен, что понимаю, что вы пытаетесь сделать.Вы хотите, чтобы это правило выполнялось только тогда, когда для свойства IsQualificationSet установлено значение true?Я не понимаю отношения между IsQualificationSet и другими свойствами.


В любом случае, если вы хотите создать собственный валидатор свойств, он должен наследоваться от базового класса PropertyValidator (AbstractValidator предназначен для проверки объекта верхнего уровня).Документация по этому вопросу доступна на вики FV ).

Таким образом, валидатор пользовательского свойства будет выглядеть примерно так:

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) - это лучший подход, если пользовательская логика проста. подробности об этом тоже есть в документации .

2 голосов
/ 18 июля 2011

Позвольте мне опубликовать мой рабочий ответ на основе ответа Джереми.

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;


    }
}
0 голосов
/ 13 апреля 2015

Я бы предложил пойти с чем-то вроде

RuleFor(r => r).Must(CustomPredicate).WithName("request");

А

private bool CustomPredicate(Request neutral)
{

 if (neutral.MediationCivil==false && !neutral.CaseEvalCondemnation==false &&        neutral.MediationMagistrate==false && neutral.CaseEvalTorts==false && neutral.CaseEvalDomesticViolence==false)
            return false;
        else return true;
}

Я написал более подробный пример здесь - http://nodogmablog.bryanhogan.net/2015/04/complex-model-validation-using-fluent-validation/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...