用于验证的绑定属性与添加按钮以在 jsf 表单中添加新项目之间的冲突

Conflict between binding attribute for validation and add button to add new item in a jsf form

在表单中,我有一个包含对象列表的部分:

<c:forEach items="#{myAction.listEtude}" var="etude">

每个对象 etude 都有一个开始日期和一个结束日期。有一个自定义验证器(已存在于应用程序中)来验证开始日期是否在结束日期之前。

这是向您展示开始日期集团的摘录:

<rich:calendar id="rsqEtdDateDebut" value="#{etude.rsqEtdDateDebut}">
    <f:attribute name="nomForm" value="Risques et expositions" />
    <f:attribute name="dateSup" value="#{rsqEtdDateFin}" />
    <f:validator validatorId="dateDebInfValidator" />
</rich:calendar>

稍后,结束日期:

<rich:calendar id="rsqEtdDateFin" binding="#{rsqEtdDateFin}" value="#{etude.rsqEtdDateFin}">
</rich:calendar>

用户可以通过单击添加按钮在列表中添加新项目(在操作 class 中调用 java 函数并呈现该部分)。

验证器工作正常,但是当用户想要添加新项目时 etude,结束日期的输入字段仅与第一个项目绑定,所有新项目都没有结束日期字段,并且验证仅采用表格中唯一的一个结束日期。

当我尝试删除绑定属性时,添加按钮工作正常(每个项目都有一个结束日期)但当然验证不再有效,因为绑定属性不涉及发送到函数的空值.

我不知道如何纠正这个问题。有人有想法吗? 提前致谢。

我尝试了这个 并且有效!这是解决方案:

c:forEach 行之后,添加:

<ui:param name="rsqEtdDateFin" value="rsqEtdDateFin#{myAction.listEtude.indexOf(etude)}" />

在开始日期组中,更改行:

<f:attribute name="dateSup" value="#{rsqEtdDateFin}" />

<f:attribute name="dateSup" value="#{requestScope[rsqEtdDateFin]}" />

最后,更改结束日期的 ID 和绑定:

id="rsqEtdDateFin#{myAction.listEtude.indexOf(etude)}"
binding="#{requestScope[rsqEtdDateFin]}"