2017-11-14 5 views
-1

wicket 7.x를 사용합니다. 두 개의 제출 버튼이있는 양식이 있습니다. 두 개의 버튼은 이벤트 제출시 다른 작업을 수행하지만 필드 검증은 동일합니다. 나는 하나의 AjaxButton onSubmit을 오버라이드하여 다른 동작을 분리하지만 동일한 검증 방법을 통과 할 수는 없습니다.Wicket 하나의 양식과 두 개의 제출 버튼이 같은 유효성 확인

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

개찰구가 없습니다. 1.7, 혹시 개찰구 7.X입니까? 또한'onValidate()'메서드를 사용하지 않는 것이 좋습니다 (무시하지 마십시오). 유효성 검사기를 구성 요소와 양식에 추가하면 SubmitButton은 기본적으로 버튼이 아니라고 명시하지 않는 한 해당 유효성 검사를 트리거합니다. 참조 : https://ci.apache.org/projects/wicket/guide/6.x/guide/forms2.html#forms2_2 –

답변

1

편집 대답.

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

업데이트

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

당신은 형성 코드를 불러 자신의 IFormValidator을 추가 할 수 있습니다 참조하십시오.

직접 확인 방법을 만드십시오.

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

doctidate 메서드를 두 번 호출 할 때마다 구현하는 것이 좋습니다. IFormValidators는 Forms validate() 메서드에서 자동으로 호출되며 재정의 가능한 onValidate 메서드가 호출됩니다. –

+0

이 방법을 사용하여 해결합니다. 수정 된 답변의 해결책. 감사 –