【问题标题】:h:selectBooleanCheckbox always pass false to validatorh:selectBooleanCheckbox 总是将 false 传递给验证器
【发布时间】:2016-04-27 10:44:13
【问题描述】:

我有h:selectBooleanCheckbox,但它总是将'false' 传递给validator.

<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,基于页面顶部的逻辑,我有一个逻辑来显示/不显示buttoncheckbox

这是我的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);
        }
    }
}

验证器sysout 总是打印checkBoxValue false

更新

在评论完 Balusc 之后,我再添加一个sysout 来直接打印参数value。但它仍然打印为value2: false

【问题讨论】:

  • @BalusC 我不清楚你提到了什么。我是 JSF 的新手。
  • @BalusC 这是现有代码。不知道他们是怎么做到的。但我现在也尝试这样HtmlSelectBooleanCheckbox checkbox = (HtmlSelectBooleanCheckbox) component; 仍然是false
  • 您的代码完全合法。您是否有任何听众注册到您的项目任何 implments javax.faces.event.PhaseListener 的类?这些侦听器可以在验证阶段之前运行并更改复选框值
  • 同时使用 Chrome 检查器检查检查表单或在提交表单时切换到网络并检查请求表单数据,您必须看到类似 j_idt5:tncSelection:on // true case 的内容,以确保将值正确发送到服务器
  • @YouYou 我需要提一下,这个提交按钮和复选框包含的面板会根据用户输入进行更新。这是作为 ajax 更新发生的。那么有什么与此更新有关的吗?更新后发生了什么?

标签: jsf jsf-2


【解决方案1】:

有一个与这种情况相关的错误,当您渲染一个包含来自另一个表单的容器时,您渲染的表单会失去其视图状态,因此表单提交到无目的地解决方案是渲染表单容器和表单来自另一种形式的自我

例如那不起作用:

  <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>

第二次提交表单是这样的:

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? 了解更多信息

希望这是问题所在:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多