p:selectOneMenu只从list primefaces JSF中获取第一个值

时间:2013-11-10 13:30:36

标签: jsf primefaces selectonemenu

我有p:selectOneMenu,所有值都被正确查看但是我的列表中的第一个可以选择,例如,在我的列表上我有电子邮件地址,我可以选择所有人但邮件只是在第一个上发送名单。我的JSF代码:


<p:dataTable value="#{additionalOrdersBean.additionalOrdersList}"
var="additionalOrders" rowIndexVar="lp" id="myTable" editable="true>
    <p:column>
        <p:selectOneMenu id="recipient"  value="#{additionalOrdersBean.mailTo}" converter="#{mailConverter}" required="true" requiredMessage="#{loc['fieldRequired']}">
            <f:selectItems value="#{buildingBean.buildingList2}" var="mail" itemLabel="#{mail.mail1}" itemValue="#{mail.mail1}" />
            <f:selectItems value="#{buildingBean.buildingList2}" var="mail" itemLabel="#{mail.mail2}" itemValue="#{mail.mail2}" />
            <f:selectItems value="#{buildingBean.buildingList2}" var="mail" itemLabel="#{mail.mail3}" itemValue="#{mail.mail3}" />
        </p:selectOneMenu>
        <h:message for="recipient" style="color:red"/>
        <h:commandButton value="#{loc['send']}" action="#{additionalOrdersBean.sendProtocol()}" onclick="sendProtocolDialog.hide()"/>
    </p:column>
</p:dataTable>


我的豆子:

private String mail1;
private String mail2;
private String mail3;

public List<Building> getBuildingList2() {
    buildingList2 = getBldRepo().findByLocationId(lid);
    return buildingList2;
}



谁能知道如何修复它?我不会在选择的地址上发送电子邮件,而不仅仅是在我的列表中。谢谢

1 个答案:

答案 0 :(得分:1)

您似乎期望在按行中的命令按钮时仅提交当前行。这是不真实的。命令按钮提交整个表单。在您的特定情况下,表单将包装整个表,因此提交每一行的下拉列表。

但是,所有这些下拉列表的value属性都绑定到同一个bean属性而不是当前迭代的行。

结果是,对于每一行,当前选择的值都在bean属性上设置,因此每次都会覆盖前一行设置的值,直到最后得到最后一行的选定值。

您在这里基本上是一个设计错误,并且对基本HTML表单的工作方式存在根本性的误解。您基本上需要将表单移动到表格单元格内部,以便仅将包含在同一单元格中的数据提交给服务器。

<p:dataTable ...>
    <p:column>
        <h:form>
            ...
        </h:form>
    </p:column>
</p:dataTable>

如果这在技术上不是一个选项(例如,因为你在同一行的另一个单元格中输入,或者在表格之外也需要发送),那么你需要绑定{{ 1}}将属性转换为当前迭代的行,并将该行完全传递给命令按钮的操作方法:

value

顺便说一下,<p:dataTable value="#{additionalOrdersBean.additionalOrdersList}" var="additionalOrders" ...> <p:column> <p:selectOneMenu value="#{additionalOrders.mailTo}" ...> ... </p:selectOneMenu> ... <h:commandButton value="#{loc['send']}" action="#{additionalOrdersBean.sendProtocol(additionalOrders)}" ... /> </p:column> </p:dataTable> 这个名字中的复数形式并不是自我记录的,而且很混乱。你不想称之为var吗?或者javabean / entity类是否代表一个真正命名为additionalOrder

的附加订单

无关具体问题:在getter方法中执行业务逻辑会导致应用程序被杀死。只是不要这样做。另请参阅Why JSF calls getters multiple times