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

마침내 성 검증의 소스 코드를 검색 후 발견 :

기본 유효성 검사가 PrototypeWebValidator이며,이 검사기는 클라이언트 측 유효성 검사를위한 PrototypeValidationGenerator를 사용하고, 당신이 "SetValueRange"를 호출 할 때이 구현은 아무것도하지 않습니다

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

그래서 그게 내 클라이언트 측 유효성 검사가 작동하지 않는 논리적 인 것 같다 (기본 검증 API는, https://github.com/atetlaw/Really-Easy-Field-Validation뿐만 아니라 그것을 impement하지 않은 주로하기 때문에 PrototypeValidationGenerator이 functionnality를 구현하지 않았다).

프레임 워크이고 프레임 워크의 목적이기 때문에이 프레임 워크를 확장하기로 결정했습니다. 프레임을 제공하고 작업하게하십시오.

은 그래서 검증이 formhelper에서 필요로 유효성 검사기를 사용자 지정 유효성 검사를 추가하기위한 몇 가지 functionnality을 제공

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

발전기를 만들어 :

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

그리고 당신에 대한 귀하의 유효성 검사기에 와이어 성 기본 컨트롤러는 다음과 같습니다 :

BaseController가 있지만이 솔루션이 최고는 아니지만 성 모노레일 구성에 주입하는 방법을 찾을 수 없습니다.

캐슬 모노레일의 근원지에이 사실을 알려 드리겠습니다 ...

관련 문제