Wicket IFormValidator — пометить несколько компонентов FormComponents как недействительные

У меня есть IFormValidator, который проверяет, согласованы ли значения нескольких FormComponents.

Теперь, если проверка не удалась, я хотел бы выделить компоненты формы, связанные с все, и соответствующие теги HTML label, как это происходит с валидаторами, которые отвечают только за один компонент формы (например, StringValidator).

Моя первая попытка заключалась в вызове FormComponent#invalid() для всех связанных FormComponents, но, похоже, это не помогло, поскольку он просто вызывает FormComponent#onInvalid(), который по умолчанию ничего не делает.

Второе, что я пробовал, это вызывать FormComponent#error(String) для каждого компонента, но это, конечно, генерирует дополнительное сообщение об ошибке для каждого FormComponent, что не является желаемым поведением. Но, по крайней мере, он выделяет отдельные недопустимые компоненты формы.

Каким будет правильный способ сделать это? Есть ли простой способ, который я упускаю из виду, поскольку метод IFormValidator#getDependentFormComponents(), который я должен реализовать, уже сообщает валидатору, какие компоненты формы будут недействительными в результате неудачной проверки?

Вот урезанный пример того, что я пробовал с 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>");
            }
        }
    }
);

Как вы показываете сообщения об ошибках? С панелью обратной связи?

OH GOD SPIDERS 22.05.2019 12:14

Да, FencedFeedbackPanel если быть точным

Tekki 22.05.2019 12:16

Хм, моей первой идеей было бы попытаться сделать так, чтобы FeedbackPanel не отображал повторяющиеся сообщения, например, с помощью IFeedbackMessageFilter. Но сначала я должен попробовать и посмотреть, возможно ли это для себя.

OH GOD SPIDERS 22.05.2019 12:21

Хм, стоит попробовать, хотя у меня могут возникнуть проблемы с отображением этих сообщений где-то еще, когда эта конкретная панель обратной связи фильтрует/не показывает эти повторяющиеся сообщения.

Tekki 22.05.2019 12:48
Основы программирования на Java
Основы программирования на Java
Java - это высокоуровневый объектно-ориентированный язык программирования, основанный на классах.
Концепции JavaScript, которые вы должны знать как JS программист!
Концепции JavaScript, которые вы должны знать как JS программист!
JavaScript (Js) - это язык программирования, объединяющий HTML и CSS с одной из основных технологий Всемирной паутины. Более 97% веб-сайтов используют...
0
4
350
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

FormComponent считается недействительным только тогда, когда вызываются его #error() методы — см. org.apache.wicket.markup.html.form.FormComponent#isValid().

Если вы хотите показать только сообщение обратной связи об ошибке формы, вам нужно создать экземпляр FeedbackPanel как:

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

Таким образом, он будет отображать сообщения обратной связи только формы.

Вы можете использовать сообщения обратной связи компонентов формы, чтобы показать их конкретные ошибки рядом с соответствующим элементом формы HTML (input, select и т. д.)

Итак, для моего примера использование ComponentFeedbackMessageFilter работает, поэтому я принимаю этот ответ. Но поскольку это также избавило от отдельных сообщений об ошибках, например, из обязательных полей (setRequired(true)), я пошел с отчетом о пустых строках (error("")) для отдельных компонентов в IFormValidator, а затем написал пользовательский IFeedbackMessageFilter, который принимает только сообщения с длиной больше 0.

Tekki 22.05.2019 22:08

Другие вопросы по теме