<f: флажок валидатора отключен не работает - PullRequest
2 голосов
/ 13 сентября 2011

Я создал собственный валидатор для своего проекта, он просто проверяет выбранное значение и «проверяет», что значение не равно «0».У нас есть стандарт (я уверен, что это не редкость) ручной установки первого значения наших компонентов selectOneMenu на:

<f:selectItem itemValue="0"
              itemLabel="-- Select One --"/>

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

Пример SelectOneMenu:

<h:selectOneMenu id="eligibility"
             value="#{reg.eligibility}"
             required="#{reg.fieldsRequired}">
<f:selectItem itemValue="0"
              itemLabel="-- Select One --"/>
<f:selectItems value="#{reg.eligibilityList}" />
<f:validator validatorId="selectOneValidator"
             disabled="#{!reg.fieldsRequired}"/>

Пользовательский валидатор:

@FacesValidator("selectOneValidator")

открытый класс SelectOneValidator реализует валидатор {

@Override
public void validate(FacesContext context, UIComponent uiComponent, Object o) throws ValidatorException {
    String val = null;
    if (uiComponent instanceof HtmlSelectOneMenu) {
        HtmlSelectOneMenu oneMenu = (HtmlSelectOneMenu) uiComponent;


        if (oneMenu.isRequired() && !oneMenu.isDisabled()) {
            if (o instanceof String) {
                val = (String) o;
            } else if (o instanceof Number) {
                val = String.valueOf(o);
            }

            if ("0".equals(val)) {
                FacesMessage msg = new FacesMessage();
                msg.setSummary("Please select a value from the list.");
                msg.setSeverity(FacesMessage.SEVERITY_ERROR);
                throw new ValidatorException(msg);
            }
        }
    }
}

}

До сих пор это работало очень хорошо, однако в текущем сценарии использования у меня проблемы.На моей странице есть несколько SelectOneMenus, один из которых переключает обязательные и отключенные атрибуты через вызов ajax для страницы.Однако у меня нет проблем с required="#{reg.fieldsRequired}";атрибут disabled="#{!reg.fieldsRequired}" моего пользовательского валидатора, похоже, не имеет значения.Я просто размышляю вслух, но при первой загрузке страницы выражение #{reg.fieldsRequired} ложно.Если затем я изменю SelectOneMenu, чтобы установить для этого логического значения значение true, затем нажмите кнопку отправки, атрибут disabled, похоже, не был установлен.Я задавался вопросом, является ли это просто проблемой AJAX, и что все компоненты просто необходимо повторно обработать, поэтому я добавил @form в свой вызов AJAX: <a4j:ajax render="@form" listener="#{reg.saveActionChanged}"/> в надежде, что это решит проблему, но без различий в поведении.

Среда:
JSF 2.0.3
Tomcat 6.0.14
вызов ajax, выполняемый с помощью RichFaces 4.0

Любая помощь приветствуется!

1 Ответ

2 голосов
/ 13 сентября 2011

Извините, я не могу воспроизвести вашу проблему с JSF 2.1.3.<f:validator disabled> работает как положено.

Однако, в качестве совершенно другой альтернативы, в этом конкретном случае вы можете просто использовать стандартный валидатор required.Вам нужно только установить значение элемента на #{null} вместо 0.

<f:selectItem itemValue="#{null}" itemLabel="-- Select One --"/>

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

<h:selectOneMenu requiredMessage="Please select a value from the list.">
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...