我有一个关于 selectOneMenu 和设置值的问题。我有一个 Object SampleDesc ,它有 ID、Text 和 List<SampleDescValues> 。对于每个数据表行, Text 是输出标签,选择一个菜单值是 List<SampleDescValues>
XHTML:

    <h:panelGroup id="tables">
    <p:dataTable resizableColumns="true"
             var="sampleDesc" id="SampleDescTable" rowIndexVar="rowIndex"
                     value="#{sampleBean.sampleDescList.list}"
                     rendered="#{sampleBean.sampleDescList.list.size() gt 0}">
            <p:column>
                    <h:outputLabel value="#{sampleDesc.sampleDescText}"/>
                </p:column>
        <p:column>
            <h:selectOneMenu required="#{sampleBean.sampleDescList.list.size() gt 0}" converter="#{sampleDescValueConverter}"
                                                         id="SampleDescValue" value="#{sampleBean.selectedSampleDescList.get(rowIndex)}">
                <f:selectItem itemLabel="Select One" itemValue="#{null}"/>
                            <f:selectItems value="#{sampleDesc.sampleDescValues}" var="sdv"
                                       itemLabel="#{sdv.sampleDescValuesText}" itemValue="#{sdv}" />

                        </h:selectOneMenu>
                </p:column>
        </p:dataTable>
</h:panelGroup>

我有转换器设置并且它可以工作,因为我将它设置为单个 SampleDescValue 并设置了该值。

问题是,当我尝试使用数据库中的样本填充表单时,它只能设置其中一个下拉列表,因为可能存在无限数量的 selectonemenu

我将选择的值设置为 private List<SampleDescValue> selectedSampleDescList;
当我尝试提交它什么都不做时,它在未呈现数据表时起作用。

最佳答案

您的菜单值错误:

<h:selectOneMenu value="#{sampleBean.selectedSampleDescList.get(rowIndex)}">
无法对此 EL 表达式执行 set 操作。
改用大括号表示法:
<h:selectOneMenu value="#{sampleBean.selectedSampleDescList[rowIndex]}">
请注意,这需要一个非空的 selectedSampleDescList 。因此,请确保您已经事先使用 new ArrayList<>() 正确初始化了它。 EL 不会为你做那件事。它只会使用 List#add(index, object) 方法设置列表项。
也可以看看:
  • Our EL wiki page

  • 与具体问题无关的 ,这个表达式
    #{sampleBean.sampleDescList.list.size() gt 0}
    
    可以简化如下
    #{not empty sampleBean.sampleDescList.list}
    
    这在 required<h:selectOneMenu> 属性中是不必要的,因为它总是在那个时候评估 true。直接使用 required="true" 代替。

    关于jsf - h :selectOneMenu in p:dataTable doesn't submit its value,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13016159/

    10-14 12:20