h:p中的selectOneMenu:dataTable不提交其值

时间:2012-10-22 17:01:18

标签: jsf datatable primefaces

我有一个关于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并设置值。

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

我将所选值设置为private List<SampleDescValue> selectedSampleDescList;

当我尝试提交它什么都不做时,它在数据表未呈现时有效。

1 个答案:

答案 0 :(得分:2)

您的菜单值错误:

<h:selectOneMenu value="#{sampleBean.selectedSampleDescList.get(rowIndex)}">

无法对此EL表达式执行set操作。

改为使用括号表示法:

<h:selectOneMenu value="#{sampleBean.selectedSampleDescList[rowIndex]}">

请注意,这需要非空selectedSampleDescList。因此,请务必事先使用new ArrayList<>()对其进行正确初始化。 EL不会为你做那件事。它只会使用List#add(index, object)方法设置列表项。

另见:


无关具体问题,此表达式

#{sampleBean.sampleDescList.list.size() gt 0}

可以简化如下

#{not empty sampleBean.sampleDescList.list}

required的{​​{1}}属性中没有必要这样做,因为此时总是评估<h:selectOneMenu>。只需直接使用true即可。