1

我有 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;
}



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

4

1 回答 1

1

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

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

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

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

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

如果这在技术上不是设计选项(例如,因为您在同一行的另一个单元格中输入了输入,或者在表之外也需要发送),那么您需要将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名称中有复数是非常令人困惑的。你不想叫它additionalOrder吗?或者表示一个附加订单的 javabean/entity 类真的命名了AdditionalOrders吗?


与具体问题无关:在 getter 方法中执行业务逻辑正在杀死您的应用程序。只是不要那样做。另请参阅为什么 JSF 多次调用 getter

于 2013-11-11T12:17:13.190 回答