Wicket IFormValidator-将多个FormComponent标记为无效

时间:2019-05-22 10:11:51

标签: java wicket

我有一个IFormValidator,它检查多个FormComponents的值是否一致。

现在,如果验证失败,我想突出显示所有相关的FormComponents和相应的HTML label标签,就像Validators一样,它们仅负责单个FormComponent(例如StringValidator)。

我的第一次尝试是在所有相关的FormComponents上调用FormComponent#invalid(),但这似乎并不能解决问题,因为它仅调用FormComponent#onInvalid(),默认情况下什么也不做。

我尝试的第二件事是在每个组件上调用FormComponent#error(String),但是这当然会为每个FormComponent生成一条附加错误消息,这不是所需的行为。但至少它确实突出显示了各个无效的FormComponents。

正确的方法是什么?我应该忽略一种简单的方法,因为我应该实现的IFormValidator#getDependentFormComponents()方法已经告诉Validator哪些FormComponents将因验证失败而无效?

以下是我对Wicket 8.3进行尝试的精简示例:

wicketForm.add(new IFormValidator() {

        @Override
        public FormComponent<?>[] getDependentFormComponents() {
            return new FormComponent<?>[] {formComponent1, formComponent2, formComponent3};
        }

        @Override
        public void validate(Form<?> form) {
            if (/*values of formComponent1-3 are not coherent*/) {
                form.error("<error message>");

                /* No highlighting at all */
                formComponent1.invalid();
                formComponent2.invalid();
                formComponent3.invalid();

                /* Highlighting works, but obviously produces same error message multiple times */
                formComponent1.error("<error message>");
                formComponent2.error("<error message>");
                formComponent3.error("<error message>");
            }
        }
    }
);

1 个答案:

答案 0 :(得分:0)

仅当FormComponent的#error()方法被调用时,才被视为无效-参见org.apache.wicket.markup.html.form.FormComponent#isValid()

如果只想显示表单的错误反馈消息,则需要实例化您的FeedbackPanel为:

new FencedFeedbackPanel("id", new ComponentFeedbackMessageFilter(form));

这样,它将仅呈现表单的反馈消息。

您可以使用表单组件的反馈消息在相应的HTML表单元素(inputselect等)旁边显示其特定错误