h:dataTable 内部使用 h:commandButton 不起作用

6

我试图通过在dataTable内部使用commandButton来执行一个action,但是如下所示,当commandButton放置在datatable内部时,action不会被调用。

<h:form>
    <h:dataTable value="#{bean.list}" var="item">
        <h:column>
            <h:commandButton value="submit" action="#{bean.submit}" />
        </h:column>
    </h:dataTable>
</h:form>

当我将commandButton移出dataTable时,action会成功执行。当commandButtondatatable内时存在问题。commandLink也有同样的问题。

1个回答

16

当在处理表单提交的HTTP请求期间,#{bean.list}后面的列表与显示表单的请求期间不完全相同时,就可能出现此问题。JSF会重新迭代列表以定位按下的按钮并调用其操作。

如果bean是请求范围的,并且在bean的(post)构造期间未重新填充列表,或者列表的填充依赖于在表单提交期间丢失的请求范围变量,则JSF在处理表单提交时将检索到空列表或完全不同的列表,因此无法定位按下的按钮并且不会调用任何操作。

最好的解决方法是将bean放在视图范围内,并确保以正确的方式加载数据模型。

@ManagedBean
@ViewScoped
public class Bean implements Serializable {

    private List<Item> list;

    @EJB
    private ItemService service;

    @PostConstruct
    public void init() {
        list = service.list();
    }

    // ...
}

另请参见:


我正在使用Spring Web Flow,并将“list”设置为视图渲染为[code]flashScope.myList[/code]。多亏了这个评论,我想到将它更改为[code]viewScope.myList[/code],效果很棒。谢谢! - Andrew Wynham

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接