1

我有多个表单,每个表单至少有一个基于不同条件呈现的命令按钮。我在表单中有一个数据表,其中一列是<h:selectBooleanCheckbox>. 在该数据表之外,我放置了一个命令按钮,以便用户可以通过选中复选框来选择一行并提交表单。我能够成功执行此任务。

<h:selectBooleanCheckbox>但是,当仅单击此特定表单内的命令按钮时,我必须设置为 必需。但是,当我按照以下方式进行操作时,它根本不起作用。当用户没有选择数据表中的任何复选框并提交表单时,如何使复选框成为必需?

    < h:form prependId="false" rendered="#{bean.somecondition}">

                    <h:dataTable id="userdata" value="#{bean.list}" var="obj">

                         <h:column>
                                <h:selectBooleanCheckbox required="#{not empty param[commandbutton.clientId]}"
                                                                    requiredMessage="Please select atleast one check box to proceed."
                                                                    value="#{bean.checked[obj.Id]}" />
                       </h:column>

                    </h:dataTable>

                  <h:commandButton value="submit" binding="#{commandbutton}"
                        action="#{bean.someaction}">
                </h:commandButton>

    </h:form>

我能够使它与 Javascript 一起工作

           $(function(){
            $('#formId').submit(function(e){
                      var checkboxes = $("input[type='checkbox']");
                     if(!checkboxes.is(":checked")){
                         $('#listcheck').show();   // This is a div contained the validation message.
                          e.preventDefault();
                         }
                     })
               });

但我想用 JSF 来做

4

1 回答 1

3

首先required="true"不适用于复选框。这完全不管它是否在数据表中,也不管required属性是用 EL 表达式硬编码true还是来自 EL 表达式。

具体原因是检查的值是never null。未选中时,它只是false、 notnull或空字符串。因此required="true",即使未选中,验证也始终通过。

JSF 实用程序库OmniFaces已经发现了这个问题并为此提供了一个解决方案omnifaces.RequiredCheckboxValidator

在您的特定情况下,您可以按如下方式使用它:

<h:selectBooleanCheckbox 
    requiredMessage="Please select at least one check box to proceed."
    value="#{bean.checked[obj.Id]}">
    <f:validator 
        validatorId="omnifaces.RequiredCheckboxValidator" 
        disabled="#{empty param[commandbutton.clientId]}" />
</h:selectBooleanCheckbox>
于 2013-09-20T13:44:20.883 回答