我有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;
}
谁能知道如何修复它?我不会在选择的地址上发送电子邮件,而不仅仅是在我的列表中。谢谢
答案 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。