2010-04-21 4 views
0

Je vois avec les validateurs Castle que je peux utiliser un attribut de validation de longueur.Longueur personnalisée Custom AbstractValidationAttribute et implémentation Castle.Components.Validator.IValidator

[ValidateLength(6, 30, "some error message")] 
    public string SomeProperty { get; set; } 

Je suis en train de trouver un MinLength seul attribut est-il un moyen de le faire avec le hors des attributs de la boîte?

Jusqu'à présent, mon idée met en œuvre AbstractValidationAttribute

public class ValidateMinLengthAttribute : AbstractValidationAttribute 

et rendre sa méthode de construction revenir un MinLengthValidator, puis en utilisant ValidateMinLength sur SomeProperty

public class MinLengthValidator : Castle.Components.Validator.IValidator 

Quelqu'un at-il un exemple d'un IValidator pleinement mis en œuvre ou savoir où cette documentation existe? Je ne suis pas sûr de ce que toutes les méthodes et propriétés attendent.

Merci

+0

Je vous suggère de saisir la source du château Validator et de voir comment les validateurs OOTB sont mises en œuvre –

+0

les ici .. fonctionnera sur problème était maintenant beaucoup plus facile http://github.com/castleproject/Castle.Components.Validator/tree/master/src/Castle.Components.Validator/Validators/ – CRice

+0

mise en œuvre AbstractValidator que la interface IValidator – CRice

Répondre

4

Au cas où quelqu'un d'autre a besoin d'aide pour cela je posterai la mise en œuvre, je suis venu avec:

[AttributeUsage(AttributeTargets.Property | AttributeTargets.ReturnValue | AttributeTargets.Parameter, AllowMultiple = true)] 
public class ValidateMinLengthAttribute : AbstractValidationAttribute 
{ 
    private IValidator validator; 

    public ValidateMinLengthAttribute(int minLength) 
    { 
     validator = new MinLengthValidator(minLength); 
    } 

    public ValidateMinLengthAttribute(int minLength, string errorMessage) : base(errorMessage) 
    { 
     validator = new MinLengthValidator(minLength); 
    } 

    public override IValidator Build() 
    { 
     ConfigureValidatorMessage(validator); 

     return validator; 
    } 
} 

[Serializable()] 
public class MinLengthValidator : AbstractValidator 
{ 
    private int _minLength; 
    private const string defaultErrorMessage = "Field must contain at least {0} characters"; 

    public MinLengthValidator(int minLength) 
    { 
     _minLength = minLength; 
    } 

    public override bool IsValid(object instance, object fieldValue) 
    { 
     if (fieldValue == null) return true; 

     return fieldValue.ToString().Length >= _minLength; 
    } 

    public override bool SupportsBrowserValidation 
    { 
     get { return true; } 
    } 

    public override void ApplyBrowserValidation(BrowserValidationConfiguration config, InputElementType inputType, IBrowserValidationGenerator generator, System.Collections.IDictionary attributes, string target) 
    { 
     base.ApplyBrowserValidation(config, inputType, generator, attributes, target); 

     string message = string.Format(defaultErrorMessage, _minLength); 
     generator.SetMinLength(target, _minLength, ErrorMessage ?? message); 
    } 

    protected override string BuildErrorMessage() 
    { 
     return string.Format(defaultErrorMessage, _minLength); 
    } 
} 
Questions connexes