Forms Primefaces-如何从另一个表单更新动态.xhtml表单

Forms Primefaces-如何从另一个表单更新动态.xhtml表单,forms,jsf,jsf-2,primefaces,Forms,Jsf,Jsf 2,Primefaces,当我点击取消请求的链接时,我想动态更新我的表单,该表单包含commandLink表单,因为此记录在此表单中不再可见。这是我的密码: <h:form id = "form"> <p:dataGrid id = "dataGrid" value="#{userRequestBean.userActiveRequests}" columns="1" var="userActiveRequest" selection="#{userRequest

当我点击取消请求的链接时,我想动态更新我的表单,该表单包含commandLink表单,因为此记录在此表单中不再可见。这是我的密码:

<h:form id = "form">
        <p:dataGrid id = "dataGrid" value="#{userRequestBean.userActiveRequests}" columns="1"
            var="userActiveRequest" selection="#{userRequestBean.request}"
            rowKey="#{userActiveRequest.id}">
            <f:facet name="header">
            My requests
        </f:facet>

            <h:panelGrid id="panelGrid">
                <h:outputText value="#{userActiveRequest.title.toUpperCase()}" />
                <h:outputText value="#{userActiveRequest.description}" />

                <h:form rendered="#{not empty userActiveRequest.hiredAgency}">
                    <h:commandLink
                        value="Details for agency #{userActiveRequest.hiredAgency.tUser.name}"
                        action="agencyDetail?faces-redirect=true">
                        <f:setPropertyActionListener target="#{agencyBean.tAgency}"
                            value="${userActiveRequest.hiredAgency}" />
                    </h:commandLink>
                </h:form>
**//HERE IS THE COMMANDLINK WHICH I MENTIONED**
                <h:form rendered="#{empty userActiveRequest.hiredAgency}">
                    To cancel, click <p:commandLink
                        value="HERE" action="#{userRequestBean.cancelRequest()}"
                        update = "form:dataGrid:panelGrid">
                        <f:setPropertyActionListener target="#{userRequestBean.request}"
                            value="${userActiveRequest}" />
                    </p:commandLink>
                </h:form>

                <p:commandButton value="Details"
                    action="userRequestDetails?faces-redirect=true">
                    <f:setPropertyActionListener target="#{userRequestBean.request}"
                        value="${userActiveRequest}" />
                </p:commandButton>
            </h:panelGrid>
        </p:dataGrid>
    </h:form>
增加: Java类的一部分:

private List<TRequest> userActiveRequests; // + get and set methods

    public UserRequestBean(){
        EntityManager em = HibernateUtil.getEntityManager();
        Query query = em.createQuery("select r " +
                "from TUser u join u.userRequests r where u.id = :userId and r.isActive = 'Y'");
        query.setParameter("userId", Long.valueOf(11));
        userActiveRequests = query.getResultList();
    }

    public void cancelRequest (){
        EntityManager em = HibernateUtil.getEntityManager();
        em.getTransaction().begin();
        request.setIsCancelled(true);
        request.setIsActive(false);
        em.merge(request);
        em.getTransaction().commit();
        //remove the object from the List
        userActiveRequests.remove(request);
    }

正如Luiggi所说,嵌套表单是无效的

请参阅以下内容:
查看一下您的设计,看看您是否真的需要嵌套该内部表单,或者可以只使用部分ajax更新来满足您的需要。

问题在于您正在嵌套表单,而这是无效的HTML。删除包装其他s的,将调用命令链接操作。我删除了outher,但它仍然给了我错误-找不到表达式为dataGrid:panelGrid的组件,该表达式引用自dataGrid:0:j_idt19:j_idt21。因此,现在真正的问题是,您正在尝试更新id无法识别的组件。为您的所有组件指定一个特定的ID,然后更新完整的组件ID。在这种情况下,删除顶部后,您的完整组件ID现在不会出现错误,但我取消的记录仍在dataGrid中。似乎更新不起作用,它不会重新刷新dataGrid。链接是删除操作还是应该更新数据库中状态的操作?您确定也在更新列表中存储的对象吗?