【发布时间】:2023-03-05 09:09:02
【问题描述】:
当我单击用于取消请求的链接时,我希望我的表单包含带有 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);
}
【问题讨论】:
-
问题是您在嵌套表单,这是无效的 HTML。删除包裹您的其他
<h:form>s 的<h:form>,然后将调用命令链接操作。 -
我删除了外部
-
所以你现在真正的问题是你正在尝试更新一个 id 无法识别的组件。为所有组件指定一个特定 ID,然后更新完整的组件 ID。在这种情况下,删除顶部的
<h:form>后,您的<p.panelGrid id="panelGrid>"的完整组件ID 将是":dataGrid:panelGrid"。 -
现在,没有发生错误,但我取消的记录仍在dataGrid中。似乎更新不起作用,它不会重新刷新dataGrid。
-
链接是删除操作还是应该更新数据库状态的操作?您确定还要更新存储在您的
List中的对象吗?
标签: forms jsf jsf-2 primefaces