2012-12-14 11 views
6

मैं निम्नलिखित वर्ग हैFluentValidation कॉल नियम-सेट और आम नियम

public class ValidProjectHeader : AbstractValidator<Projects.ProjectHeader> 
    { 
     public ValidProjectHeader() 
     { 

      RuleFor(x => x.LobId).Must(ValidateLOBIDExists); 
      RuleFor(x => x.CreatedByUserId).NotEmpty(); 
      RuleFor(x => x.ProjectManagerId).NotEmpty(); 
      RuleFor(x => x.ProjectName).NotEmpty(); 
      RuleFor(x => x.SalesRepId).NotEmpty(); 
      RuleFor(x => x.DeliveryDate).NotEmpty(); 
      RuleFor(x => x.ProjectStatusId).NotEmpty(); 
      RuleFor(x => x.DeptartmentId).NotEmpty(); 
      RuleFor(x => x.CustomerId).NotEmpty(); 

      RuleSet("Insert",() => 
      { 
       RuleFor(x => x.ProjectLines).Must(ValidateProjectLines).SetCollectionValidator(new ValidProjectLine()); 
      }); 
      RuleSet("Update",() => 
      { 
       RuleFor(x => x.ProjectLines).SetCollectionValidator(new ValidProjectLine()); 
      }); 


     } 

और मुझे क्या करना कोशिश कर रहा हूँ rulset साथ मान्यता कहते हैं, लेकिन मैं भी "आम" नियम वापस जाने के लिए जब मैं फोन चाहते हैं नियमसेट के साथ सत्यापन।

कोड मैं मान्यता फोन करने के लिए है के रूप में इस प्रकार है

public abstract class BaseValidator 
    { 
     private List<ValidationFailure> _errors; 
     public bool IsValid { get; protected set; } 
     public List<ValidationFailure> Errors 
     { 
      get { return _errors; } 
      protected set { _errors = value; } 
     } 
     public virtual bool CallValidation() 
     { 
      Errors = new List<ValidationFailure>(); 
      ValidatorAttribute val = this.GetType().GetCustomAttributes(typeof(ValidatorAttribute), true)[0] as ValidatorAttribute; 
      IValidator validator = Activator.CreateInstance(val.ValidatorType) as IValidator; 
      FluentValidation.Results.ValidationResult result = validator.Validate(this); 
      IsValid = result.IsValid; 
      Errors = result.Errors.ToList(); 
      return result.IsValid; 
     } 

     public virtual bool CallValidation(string ruleSet) 
     { 
      Errors = new List<ValidationFailure>(); 
      ValidatorAttribute val = this.GetType().GetCustomAttributes(typeof(ValidatorAttribute), true)[0] as ValidatorAttribute; 
      IValidator validator = Activator.CreateInstance(val.ValidatorType) as IValidator; 
      FluentValidation.Results.ValidationResult result = validator.Validate(new FluentValidation.ValidationContext(this, new PropertyChain(), new RulesetValidatorSelector(ruleSet))); 
      IsValid = result.IsValid; 
      Errors = result.Errors.ToList(); 
      return result.IsValid; 
     } 

     public BaseValidator() 
     { 
      Errors = new List<ValidationFailure>(); 
     } 
    } 

मैं सदस्य ruleSet साथ विधि CallValidation कॉल कर सकते हैं, लेकिन यह बुला नहीं है भी "आम" नियम है।

मुझे पता है कि मैं इन नियमों को चलाने के लिए "सामान्य" नियमसेट बना सकता हूं लेकिन उस स्थिति में मुझे हमेशा सामान्य नियमसेट के साथ सत्यापन करना होगा।

क्या कोई तरीका है कि मैं नियमसेट को कॉल कर सकता हूं और सामान्य नियम भी कह सकता हूं।

उत्तर

3

मैं एक तरह से CallValidation(string ruleSet) विधि के रूप में इस प्रकार है

public virtual bool CallValidation(string ruleSet) 
     { 
      Errors = new List<ValidationFailure>(); 
      ValidatorAttribute val = this.GetType().GetCustomAttributes(typeof(ValidatorAttribute), true)[0] as ValidatorAttribute; 
      IValidator validator = Activator.CreateInstance(val.ValidatorType) as IValidator; 
      FluentValidation.Results.ValidationResult result = validator.Validate(new FluentValidation.ValidationContext(this, new PropertyChain(), new RulesetValidatorSelector(ruleSet))); 
      FluentValidation.Results.ValidationResult resultCommon = validator.Validate(this); 
      IsValid = (result.IsValid && resultCommon.IsValid); 
      Errors = result.Errors.Union(resultCommon.Errors).ToList(); 
      return IsValid; 
     } 
7

इसके बजाय आप यह कर सकता है के लिए एक दूसरी validator.Validate जोड़कर यह करने के लिए मिल गया है:

FluentValidation.Results.ValidationResult resultCommon = validator.Validate(parameter, Ruleset : "default, Insert"); 
+0

यह विकल्प कम से कम 200 9 से गिट स्रोत कोड में मौजूद प्रतीत नहीं होता है, जो मुझे दस्तावेज गलत होने के बाद यहां ले गया है। – john

+0

महान सलाह! FluentValidation 6.2.1 में RuleSet तर्क केस अलग है: "नियम:" के बजाय "नियमसेट:"। उदाहरण: validator.Validate (obj, ruleSet: "डिफ़ॉल्ट, सम्मिलित करें"); –

6

अपने सत्यापनकर्ता कक्षा में एक विधि बनाएं, जिसमें सभी "सामान्य" नियम शामिल हैं जिन्हें हर समय लागू करने की आवश्यकता होती है। अब आप इस विधि का

  • अपने "बनाने के" नियम-सेट से
  • नियम-सेट के बाहर से उदाहरण

    public class MyEntityValidator : AbstractValidator<MyEntity> 
    { 
        public MyEntityValidator() 
        { 
         RuleSet("Create",() => 
          { 
           RuleFor(x => x.Email).EmailAddress(); 
           ExecuteCommonRules(); 
          }); 
    
         ExecuteCommonRules(); 
        } 
    
        /// <summary> 
        /// Rules that should be applied at all times 
        /// </summary> 
        private void ExecuteCommonRules() 
        { 
         RuleFor(x => x.Name).NotEmpty(); 
         RuleFor(x => x.City).NotEmpty(); 
        } 
    } 
    

    कॉल कर सकते हैं

आप अपने नियंत्रक में एक कार्रवाई के लिए नियम-सेट को परिभाषित

[HttpPost] 
public ActionResult Create([CustomizeValidator(RuleSet = "Create")] MyEntity model) 

यह बीमा करेगा कि कार्रवाई के अनुरोधों को नियमसेट बनाएँ के साथ सत्यापित किया जाएगा। अन्य सभी क्रियाएं नियंत्रक में ExecuteCommonRules को कॉल का उपयोग करेंगी।