Отключить проверку в форме ICEFaces при определенных нажатиях кнопок - PullRequest
1 голос
/ 26 ноября 2011

У меня есть форма IceFaces с несколькими HtmlCommandButtons. У меня есть несколько полей ввода, к которым прикреплены валидаторы. Проверка работает хорошо, но запускает и блокирует процесс, даже если я нажимаю кнопки, отличные от кнопки отправки. Логично, потому что все мои кнопки в основном одинаковы. Вопрос: как отличить кнопки от аспекта проверки?

Я не могу предоставить фрагмент XHTML, потому что моя форма создается динамически из кода Java. Кнопки создаются следующим образом:

    HtmlCommandButton comp = new HtmlCommandButton();
    comp.setId("btn" + StringUtil.toId(label) + "_" + action);
    comp.setTitle(label);
    comp.setValue(label);
    comp.setStyleClass("commandexbutton commandexbutton-" + StringUtil.toId(label));
    comp.addActionListener(JSFBuilderHelper.createActionListener(getActionListenerStr()));
    comp.setPartialSubmit(true);

1 Ответ

1 голос
/ 26 ноября 2011

В простейшем случае вы можете установить атрибут immediate компонента UICommand на true. Затем он пропустит обработку UIInput компонентов, которые не имеют этот атрибут true.

comp.setImmediate(true);

Подробное описание использования этого атрибута см. Во второй половине этого ответа .

Если это не вариант, то лучше всего поместить кнопку отмены в отдельную форму, чтобы она фактически заканчивалась следующим образом:

<h:form>
    input fields 
    submit button
</h:form>
<h:form>
    cancel button
</h:form>

Если это также невозможно из-за ограничений дизайна / макета (читай: это невозможно исправить только с помощью CSS / JS), то вам нужно в каждом валидаторе проверять, какая кнопка была нажата. Вы можете проверить это по наличию имени клиента (ID) кнопки в карте параметров запроса. Например, в качестве атрибута компонента:

required="#{not empty param['formId:submitButtonId']}"

или

required="#{empty param['formId:cancelButtonId']}"

или в начале метода валидатора validate():

if (externalContext.getRequestParameterMap().get("formId:submitButtonId") == null) {
    return; // Skip validation when normal submit button is not pressed.
}

или

if (externalContext.getRequestParameterMap().get("formId:cancelButtonId") != null) {
    return; // Skip validation when cancel button is pressed.
}
...