Wie erstelle ich einen benutzerdefinierten Validator für die Validierung der Burg auf der Client-Seite?

StackOverflow https://stackoverflow.com/questions/8853768

  •  28-10-2019
  •  | 
  •  

Frage

Ich verwende die Castle -Validierung und ich möchte wissen, warum mein Validator nicht funktioniert:

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

Und mein Feld

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

Und meine Sicht

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

Die validateNoneMpty validiert sowohl auf Client- als auch auf Serverseite, aber der validatepositiveItinger ist es nicht.

Ich habe diesen Thread gesehen Min Länge benutzerdefinierte AbstractValidationAttribute und Implementierung castle.components.validator.ivalidator , aber ich kann keinen Unterschied zwischen meinem und seinem Code sehen.

War es hilfreich?

Lösung

Ich habe es endlich gefunden, nachdem ich den Quellcode der Burgvalidierungsquellen durchsucht habe:

Die Standardvalidierung ist Prototypewebvalidator, und dieser Validator verwendet PrototypevalidationGenerator zur Client -Seitenvalidierung. Diese Implementierung nennt nichts, wenn Sie "setValuerange" aufrufen:

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

Das erscheint also logisch, dass meine Client -Seitenvalidierung nicht funktioniert (der PrototypevalidationGenerator implementiert diese Funktionsnalität nicht hauptsächlich, weil die zugrunde liegende Validierungs -API. https://github.com/atetlaw/really-easy-field-validation hat es nicht auch impustert).

Deshalb habe ich mich entschlossen, dies zu erweitern, weil es sich um einen Rahmen handelt und der Zweck eines Frameworks: Stellen Sie einen Rahmen an und lassen Sie Sie darin arbeiten.

Also habe ich den Generator erstellt

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

Der Validator bietet eine Funktion für das Hinzufügen einer benutzerdefinierten Validierung des Validators, der vom FormHelper benötigt wird:

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

Und Sie verdrahten Sie Ihren Validator auf Ihrem Basicontroller wie folgt:

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

Ich habe einen Basecontroller, aber diese Lösung ist nicht die beste, aber ich konnte nicht herausfinden, wie ich sie in die Konfiguration des Schlossmonorails injizieren kann.

Ich werde versuchen, dies für die Quellbasis von Castle Monorail zu verpflichten ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top