You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用ui:repeat渲染p:selectOneMenu仅能获取最后一个选中值如何解决

问题根因

所有循环渲染的p:selectOneMenu组件都绑定了#{formFieldsBean.selectedOption}同一个属性,每次循环都会覆盖该属性的绑定关系,表单提交时最后一个下拉框的选中值会把之前的赋值全部覆盖,因此只能拿到最后一个值。

解决方案

步骤1:调整存储结构

有两种可选的存储方式,按需选择:

  • 方式一:修改Field实体类,新增selectedValue属性,用于单独存储每个字段对应的下拉选中值
    public class Field {
        // 原有其他属性
        private String selectedValue;
        // 生成getter、setter方法
        public String getSelectedValue() { return selectedValue; }
        public void setSelectedValue(String selectedValue) { this.selectedValue = selectedValue; }
    }
    
  • 方式二:在formFieldsBean中新增Map结构存储所有下拉的选中值,不需要修改实体类
    @ViewScoped
    @Named
    public class FormFieldsBean {
        // 原有其他属性
        private Map<Long, String> selectedOptionMap = new HashMap<>();
        // 生成getter、setter方法
        public Map<Long, String> getSelectedOptionMap() { return selectedOptionMap; }
        public void setSelectedOptionMap(Map<Long, String> selectedOptionMap) { this.selectedOptionMap = selectedOptionMap; }
    }
    

注意:formFieldsBean必须使用@ViewScoped作用域,不能用@RequestScoped,避免回发时列表数据重建导致绑定失效

步骤2:修改页面绑定

将p:selectOneMenu的value属性修改为对应每个字段的独立存储位置:

  • 若用方式一(实体加属性),修改后的页面代码如下:
<ui:repeat value="#{formFieldsBean.fieldList}" var="field">
    <p:panelGrid columns="2" id="grid2"
        columnClasses="ui-grid-col-5,ui-grid-col-4"
        layout="grid"
        styleClass="ui-panelgrid-blank ui-fluid"
        style="border:0px none; background-color:transparent;">
                          
        <p:outputLabel  for="@next" value="#{field.question}" rendered="#{field.type == grp.grp}"/>
        <p:selectOneMenu  value="#{field.selectedValue}"  rendered="#{field.type == grp.grp}">
            <f:selectItem itemLabel="Select One" itemValue="" />
            <f:selectItem itemLabel="Yes" itemValue="Yes" />
            <f:selectItem itemLabel="No" itemValue="No" />
            <f:selectItem itemLabel="NA" itemValue="NA" />
        </p:selectOneMenu>
    </p:panelGrid>
</ui:repeat>

提交后直接遍历formFieldsBean.fieldList,读取每个field的selectedValue即可拿到所有选中值。

  • 若用方式二(Bean加Map),修改p:selectOneMenu的value属性为:
<p:selectOneMenu  value="#{formFieldsBean.selectedOptionMap[field.id]}"  rendered="#{field.type == grp.grp}">

注意:此处field.id是Field实体的唯一主键,确保每个字段的key唯一,提交后读取selectedOptionMap即可拿到所有字段对应的选中值。

内容的提问来源于stack exchange,提问作者Tafadzwa Mashakada

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 20:45:09