OmniFaces o:validateAllOrNone in ui:repeat或h:dataTable

时间:2013-05-27 15:50:17

标签: jsf-2 datatable validation omnifaces

是否可以在<o:validateAllOrNone><ui:repeat>内使用OmniFaces <h:dataTable>(这很酷;)?

我需要一个表,每行都有一个输入字段列。您可以填写这些值或全部值。

如果我将<o:validateAllOrNone>放在<ui:repeat><h:dataTable>中并使用components属性中输入字段的ID,那么验证器也会被触发,如果全部字段是空的。

1 个答案:

答案 0 :(得分:0)

不,那是不可能的。 components属性必须物理上引用多个组件,而不是多次呈现的单个组件。然而,它可以用在物理上多个组件上,这些组件在相同的迭代轮次期间呈现。 <o:validateXxx>多字段验证程序不是为了引用多次呈现的单个组件而设计的。唯一能做到这一点的OmniFaces验证器是<o:validateUniqueColumn>

如果要根据集合对动态输入使用<o:validateXxx>多字段验证器,那么最好的办法是使用JSTL <c:forEach>。它将物理构建多个组件。

E.g。

<c:forEach items="#{bean.items}" var="item" varStatus="loop">
    <h:inputText id="input_#{loop.index}" value="#{item.value}" />
</c:forEach>

假设有3个项目,这将动态创建ID为input_0input_1input_2的JSF组件。然后你可以按如下方式使用<o:validateXxx>(把它放在循环之外!)

<o:validateAllOrNone components="input_0 input_1 input_2" />

您可以通过EL表达式替换上面示例中的硬编码字符串,该表达式从辅助bean返回所需的空格分隔的组件ID字符串。

<o:validateAllOrNone components="#{bean.inputIds}" />

另一种方法是自己创建<x:validateAllOrNoneColumn>或在OmniFaces问题跟踪器上发布增强请求。改变现有的<o:validateAllOrNone>并不需要完全独立的组件。