2016-01-21 2 views
0

У меня есть h:selectBooleanCheckbox, но он всегда проходит 'false' до validator..h: selectBooleanCheckbox всегда передает false в валидатор

<h:panelGroup id="tncPanel"> 
<label> 
    <h:selectBooleanCheckbox id="tncSelection" value="#{businessBean.tncSelection}"> 
    <f:validator validatorId="checkboxValidator"/> 
    <f:attribute name="label" value="Please agree terms and conditions."/> 
    </h:selectBooleanCheckbox> 
    I have read and agreed to all the 
    <a href="#" data-toggle="modal" data-target="#modal-term-and-conditions"> 
    Terms and Conditions. 
    </a> 
</label> 
</h:panelGroup> 

<h:panelGroup id="buttonPanel"> 
    <h:commandLink id="nextButton" action="#{businessBean.goNext}"> 
     Submit 
    </h:commandLink> 
</h:panelGroup> 

Почему я должен panelGroup здесь есть, на основе логики в верхней части страницы, у меня есть логика для отображения/не в button и checkbox

Это мой Validator.

@FacesValidator("checkboxValidator") 
public class CheckboxValidator implements Validator { 

    private static final String DEFAULT_LABEL = "Please confirm the address."; 

    @Override 
    public void validate(FacesContext context, UIComponent component, Object value){ 
     String checkBoxValue = String.valueOf(((HtmlSelectBooleanCheckbox) component).getSubmittedValue()); 

     System.out.println("checkBoxValue " + checkBoxValue); 
     System.out.println("value2: " + value); 

     String label = String.valueOf(component.getAttributes().get("label")); 
     if ("null".equals(label)) { 
      label = DEFAULT_LABEL; 
     } 
     if("false".equalsIgnoreCase(checkBoxValue)){ 
      FacesMessage msg = new FacesMessage(null, label); 
      msg.setSeverity(FacesMessage.SEVERITY_ERROR); 
      throw new ValidatorException(msg); 
     } 
    } 
} 

Validator sysout всегда печатает checkBoxValue false

UPDATE

После комментария на Balusc, я добавляю еще sysout непосредственно параметра value печати. Но все же это печатает как value2: false.

+0

@BalusC Я не совсем понимаю, что вы упомянули. Я новичок в JSF. –

+0

@BalusC Это существующий код. Не знаете, как они это сделали. но я также стараюсь так же теперь: «HtmlSelectBooleanCheckbox checkbox = (HtmlSelectBooleanCheckbox)»; «Все еще это« false » –

+0

Ваш код совершенно легален. У вас есть слушатели, зарегистрированные в вашем проекте, какие-либо классы, которые «внедряют javax.faces.event.PhaseListener»? Эти слушатели могут работать до проверки флажка проверки и изменения флажка – YouYou

ответ

0

Существует ошибка, связанная с этой ситуацией. Когда вы визуализируете контейнер, в котором хранится from из другой формы, вы визуализированная форма теряет свое состояние представления. Таким образом, форма не передается никакому целевому решению, это отображать контейнер формы и формируют его самостоятельно из другой формы

Например, что не будет работать:

<h:panelGroup id="panel"> 
     <h:form> 
     <h:commandButton value="Submit" rendered="#{not testAction.flag}"> 
       <f:ajax render=":panel" listener="#{testAction.submit()}"/> 
      </h:commandButton> 
     </h:form> 
     <h:panelGroup id="panel"> 

     <h:form id="secondForm" rendered="#{testAction.flag}"> 
      <h:selectBooleanCheckbox id="checkBox" value="#{testAction.boolVal}"> 
       <f:validator validatorId="checkboxValidator"/> 
      </h:selectBooleanCheckbox> 
      <h:commandButton value="Go" action="#{testAction.go()}"/> 

     </h:form> 
    </h:panelGroup> 

Вторая форма будет представить следующим образом:

enter image description here

secondForm не будет иметь своего представления о том, что форма отправлена, но без адресата на сервере, поскольку объект вида не выбран на сервере, для которого требуется значение javax.faces.ViewState, которое должно быть получено из того, что вы должны здесь сделать, - это визуализировать форма, а также в f:ajax:

<f:ajax render=":panel :secondForm" listener="#{testAction.submit()}"/> 

Это информирует сервер для резервного копирования второй формы визуализироваться с javax.faces.ViewState

Обратитесь к этому сообщению: Rendering other form by ajax causes its view state to be lost, how do I add this back? для получения дополнительной информации

Надеюсь, что это была проблема :)