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

Wicket IFormValidator - Mark multiple FormComponents as invalid

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

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

我的第一次尝试是在所有相关的 FormComponents 上调用 FormComponent#invalid(),但这似乎没有用,因为它只是调用 FormComponent#onInvalid(),默认情况下什么都不做。

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

执行此操作的正确方法是什么?有没有一种我忽略的简单方法,因为我应该实现的 IFormValidator#getDependentFormComponents() 方法已经告诉验证器,哪些 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>");
            }
        }
    }
);

FormComponent 只有在其 #error() 方法被调用时才被视为无效 - 参见 org.apache.wicket.markup.html.form.FormComponent#isValid().

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

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

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

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