如果禁用字段,则会阻止出现验证消息

时间:2013-08-28 19:37:54

标签: validation jsf

我有一个禁用某种表单的复选框。

<h:selectBooleanCheckbox id="ldapAuthEnabled" value="#{enabled}" label="check it">

当我检查它时,它会导致禁用我表单中的所有字段,以便:

<h:inputText mandatory="true" value="#{someVar}" 
disabled="#{!enabled}" required="#{enabled}" />

时会出现问题
  1. 我尝试在未禁用字段时保护表单 - 它显示验证消息!
  2. 然后我点击复选框,它会禁用所有字段,但是它仍然显示验证消息!所以,它甚至不能因为这个而转到我的controller.safe()方法。
  3. 问题是:如何使其按预期工作? - 禁用字段时,无需保留验证消息并认为该表单无效。

    - 编辑:

    正如答案(来自BalusC)中所建议的,我将“值”更改为“绑定”,所以现在我有这样的代码:

    <h:panelGroup id="my-panel">
    
    <h:selectBooleanCheckbox id="myEdit" binding="#{checkbox}" label="enable it!">
      <f:ajax event="click" render="my-panel"/>
    </h:selectBooleanCheckbox>
    
    <h:inputText id="name" value="#{bean.name}" disabled="#{not checkbox.value}" required="true" />
       <h:outputText value="sometext"/>                      
    </h:panelGroup>
    

    "<h:panelGroup id="my-panel">"是“表单”的一部分。

    但是有相同的结果 - 验证错误阻止我做save​​()。

    我现在为我的bean使用“SessionScope”。

1 个答案:

答案 0 :(得分:2)

具体的功能要求是合理的,但到目前为止发布的代码是如此奇怪和不完整,以至于难以解释它的具体问题。到目前为止,您在理论上不起作用,因为模型值仅在更新模型值阶段更新,而禁用/必需属性在应用请求值和验证阶段之前很久就会被检查。

基本上,您应该将checkbox值绑定到位于视图范围内的模型中的布尔属性,如下所示:

<h:selectBooleanCheckbox value="#{bean.enabled}" />
<h:inputText required="true" disabled="#{not bean.enabled}" />

或至少将物理复选框组件本身检查到视图中,如下所示:

<h:selectBooleanCheckbox binding="#{checkbox}" />
<h:inputText required="true" disabled="#{not checkbox.value}" />

当选中(取消)复选框时,不要忘记提交值和ajax-update表单。我也没有在你的任何地方看到这一点。总而言之,这个完整的copy'n'paste'n'runnable启动示例应该让你开始:

<h:form>
    <h:selectBooleanCheckbox binding="#{checkbox}">
        <f:ajax render="@form" />
    </h:selectBooleanCheckbox>

    <h:inputText required="true" disabled="#{not checkbox.value}" />
    <h:inputText required="true" disabled="#{not checkbox.value}" />
    <h:inputText required="true" disabled="#{not checkbox.value}" />

    <h:commandButton value="submit" />
    <h:messages />
</h:form>

另见: