【问题标题】:h:selectOneMenu in p:dataTable doesn't submit its valuep:dataTable 中的 h:selectOneMenu 未提交其值
【发布时间】:2012-10-22 17:01:17
【问题描述】:

我对 selectOneMenu 和设置值有疑问。我有一个 Object SampleDesc,它有 ID、Text 和 List<SampleDescValues>。对于每个数据表行,文本是输出标签,选择一个菜单值是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 并且它设置了值。

问题是,当我尝试使用数据库中的样本填充表单时,它只能设置一个下拉菜单,而选择菜单的数量可能是无限的

我将选择的值设置为private List&lt;SampleDescValue&gt; selectedSampleDescList;

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

【问题讨论】:

    标签: jsf datatable primefaces


    【解决方案1】:

    您的菜单值错误:

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

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

    改用大括号表示法:

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

    请注意,这需要一个非空的selectedSampleDescList。因此,请确保您已经事先使用new ArrayList&lt;&gt;() 正确初始化了它。 EL不会为你这样做。它只会使用List#add(index, object) 方法设置列表项。

    另见:


    与具体问题无关,这个表达式

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

    可以简化如下

    #{not empty sampleBean.sampleDescList.list}
    

    这在&lt;h:selectOneMenu&gt;required 属性中是不必要的,因为它总是 会在此时评估true。直接改用required="true"就好了。

    【讨论】:

    • 谢谢你,这正是我想要的。我有一个有关如何从 EL 表达式访问 'private List> selectedSampleDescList' 对象的相关问题。我有一个嵌套数据表,它以与本示例相同的方式生成下拉列表,因此我需要以某种方式跟踪它们。 sampleBean.selectedSampleDescList[rowIndex][subDataTableRowIndex] 没有用。
    • 您是否使用新的ArrayList 预初始化每个嵌套项?
    • 我发现我没有为每个子列表创建一个新的数组列表。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 2012-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-22
    • 2011-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多