2012-01-13 4 views
1

Я использую проверку замка, и я хотел бы знать, почему мой валидатор не работает:Как создать пользовательский валидатор для проверки замка на стороне клиента?

[Serializable] 
    public class PositiveIntegerValidator : AbstractValidator 
    { 


    public override bool IsValid(object instance, object fieldValue) 
    { 
     if (fieldValue == null || !(fieldValue is int)) 
      return false; 
     return ((int)fieldValue) > 0; 
    } 

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


     generator.SetValueRange(target, 0,int.MaxValue, ErrorMessage); 
    } 

    protected override string BuildErrorMessage() 
    { 
     return ErrorMessage; 
    } 
} 
public class ValidatePositiveIntegerAttribute : AbstractValidationAttribute 
{ 
    public ValidatePositiveIntegerAttribute(string msg) :base(msg){} 
    public override IValidator Build() 
    { 
     PositiveIntegerValidator positiveIntegerValidator = new PositiveIntegerValidator(); 
     ConfigureValidatorMessage(positiveIntegerValidator); 
     return positiveIntegerValidator; 
    } 
} 

И мое поле

public class PackageViewModel 
     { 
//   ... 
      [ValidateNonEmpty,ValidatePositiveInteger("The package count must be positive")] 
      public int nbPackage { get; set; } 
//... 
} 

И мой взгляд

$FormHelper.TextField("package.nbPackage","%{size='3',value='1'}") 

ValidateNonEmpty проверяет как на стороне клиента, так и на стороне сервера, но ValidatePositiveInteger - нет.

Я видел эту тему Min Length Custom AbstractValidationAttribute and Implementing Castle.Components.Validator.IValidator, но я не вижу никакой разницы между моим кодом и его.

ответ

1

я, наконец, нашел его после просмотра Замка Validation исходного кода:

проверки по умолчанию PrototypeWebValidator, и этот валидатор использует PrototypeValidationGenerator для проверки на стороне клиента, и эта реализация не делает ничего, когда вы называете «SetValueRange»:

public void SetValueRange(string target, int minValue, int maxValue, string violationMessage) 
     { 
     } 

так, что кажется логичным, что моя проверка на стороне клиента не работает (PrototypeValidationGenerator не реализовали этот functionnality главным образом потому, что в основе проверки API, https://github.com/atetlaw/Really-Easy-Field-Validation не impement его, а).

Поэтому я решил продлить это, потому что это основа, и это цель рамки: предоставить кадр и позволить вам работать в нем.

Так что я создал генератор

public class PrototypeValidationGeneratorExtension : PrototypeWebValidator.PrototypeValidationGenerator 
{ 
    private PrototypeWebValidator.PrototypeValidationConfiguration _config; 
    public PrototypeValidationGeneratorExtension(PrototypeWebValidator.PrototypeValidationConfiguration config, InputElementType inputType, IDictionary attributes) 
     :base(config,inputType,attributes) 
    { 
     _config = config; 
    } 
    public new void SetValueRange(string target, int minValue, int maxValue, string violationMessage) 
    { 
        this._config.AddCustomRule("validate-range",violationMessage,string.Format("min : {0}, max : {1}", minValue, maxValue)); 
    } 
} 

Валидатора обеспечить некоторую functionnality для добавления пользовательской проверки валидатора, который необходим в FormHelper:

public class PrototypeWebValidatorExtension : PrototypeWebValidator 
{ 
    public new IBrowserValidationGenerator CreateGenerator(BrowserValidationConfiguration config, InputElementType inputType, IDictionary attributes) 
    { 
     return new PrototypeValidationGeneratorExtension((PrototypeWebValidator.PrototypeValidationConfiguration)config, inputType, attributes); 
    } 
} 

И проводной замок для вашего валидатора на ваш базовый контроллер следующим образом:

 protected override void Initialize() 
     { 
      ((FormHelper)this.Helpers["Form"]).UseWebValidatorProvider(new PrototypeWebValidatorExtension()); 
// ... 
    } 

У меня есть BaseController, но это решение не самое лучшее, но я не мог понять, как его вставить в конфигурацию монорельса замка.

Я попытаюсь передать это исходной базе замкового монорельса ...