2017-11-14 1 views
-1

私はwicket 7.xを使用します。私は2つの送信ボタンを持つフォームを持っています。 2つのボタンは、送信イベントでは異なる動作を行いますが、同じフィールド検証があります。 AjaxButton onSubmitをオーバーライドして別の動作を分離していますが、同じ検証メソッドに渡すことはできませんでした。Wicket同じフォームで2つの提出ボタンがある

button = new AjaxButton("id",this.getRootForm()) { 
    @Override 
    protected void onSubmit(AjaxRequestTarget target, Form<?> form){...} 
} 
button.setDefaultFormProcessing(false); 

@Override 
protected void onValidate() {...} 

@Override 
protected void onSubmit() {...} 

フォームと同じ検証方法をどのように通過できますか?


あなたはIValidatorまたはIFormValidatorを実装し、すべてのあなたのForm秒でそれを使用する必要があります

this.getRootForm().add(new IFormValidator() { 

    @Override 
    public void validate(Form<?> form) { 
      doValidate(form); 
    } 
    @Override 
    public FormComponent<?>[] getDependentFormComponents() { 
     FormComponent<?>[] c = new FormComponent<?>[6]; 
     c[0] = nome; 
     c[1] = email; 
     c[2] = cognome; 
     c[3] = indirizzo; 
     c[4] = telefono; 
     c[5] = captcha; 
     return c; 
     } 
}); 

protected void doValidate(Form<?> form) {...} 

button = new AjaxButton("id",this.getRootForm()) { 
    @Override 
    protected void onSubmit(AjaxRequestTarget target, Form<?> form){ 
     doValidate(form); 
     if (!form.hasError()) { 
      ... 
     } else{ 
      target.add(feedbackPanel); 
     } 
    } 
} 
button.setDefaultFormProcessing(false); 
+0

wicket 1.7はありません。万が一改札7.Xを意味するのですか?また、 'onValidate()'メソッド(オーバーライドしない)を使用しないことをお勧めします。あなたのコンポーネントとフォームにValidatorを追加するだけです。あなたがボタンではないと明示的に指示しない限り、SubmitButtonはデフォルトでそのvalidaitonをトリガーします。参照してください:https://ci.apache.org/projects/wicket/guide/6.x/guide/forms2.html#forms2_2 –

答えて

1

編集回答。

は、あなたがあなたのコードを形成し、リコールするために独自のIFormValidatorを追加することができます

public class MyValidatingBehavior extends Behavior implements IValidator { 


    @Override 
    public void onComponentTag(Component component, ComponentTag tag) { 
    super.onComponentTag(component, tag); 
    if (component.hasErrorMessage()) { 
     tag.append("class", "my-error-style", " "); 
    } 
    } 

    @Override 
    public void validate(final IValidatable<String> validatable) { 
    final String candidate = validatable.getValue(); 
    if (!isValid(candidate)) { 
     validatable.error(new ValidationError(this)); 
    } 
    } 
} 
+0

私はいくつかのコードを追加することができますか?つまり、エラーが発生した場合はCssクラスを追加します。この検証方法ではどうすればいいですか? –

+0

@MatteoPezzaneraエラーが発生した場合にコンポーネントにcssクラスを追加させたい場合は、 'Behaviour'を記述し、' onComponentTag'メソッドをオーバーライドすることで実装することができます。このメソッドでは、単に 'component.hasErrorMessage()'をチェックし、accodinglyタグを変更します。 –

+0

@MatteoPezzanera私の更新答えを見てください。ありがとう。 –

1

更新https://ci.apache.org/projects/wicket/guide/8.x/single.html#_form_validation_and_feedback_messages

を参照してください。

独自の検証方法を作成します。

void doValidate(Form<?> form) { 
    your validation code here for form. 
} 

this.getRootForm().add(new IFormValidator() { 

    void validate(Form<?> form) { 
     doValidate(form); 
    } 
}); 

@Override 
protected void onValidate() { 
    doValidate(this); 
} 
+0

これは、doValidateメソッドをサブミットごとに2回コールするように実装していると確信しています。 IFormValidatorsはForms validate()メソッドで自動的に呼び出され、オーバーライド可能なonValidateメソッドが呼び出されます。 –

+0

この方法で解決します。編集された答えの解。ありがとう –

関連する問題