2013-01-11 13 views
8

Ho una tabella di dati di PrimeFaces che mostra un insieme di utenti con un comando da eliminare su ogni riga. Quando si fa clic sul collegamento, viene visualizzata una confirmDialog con un pulsante "Sì" che dovrebbe chiamare il metodo "delete" nel backing bean. Sfortunatamente, questo metodo non viene chiamato e la finestra di dialogo è appena nascosta. Il parametro dal collegamento è impostato perché l'ho visto con il debugger.PrimoFaces commandButton in confirmDialog non chiama backing bean

Qui è la mia pagina:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" 
xmlns:h="http://java.sun.com/jsf/html" 
xmlns:f="http://java.sun.com/jsf/core" 
xmlns:ui="http://java.sun.com/jsf/facelets" 
xmlns:p="http://primefaces.org/ui"> 
<h:head><title>Manage users</title></h:head> 
<h:body> 
<ui:composition template="../../template/commonLayout.xhtml"> 
    <ui:define name="content"> 
     <p:layoutUnit position="center"> 
      <h:form id="datatable"> 
       <p:tabView> 
        <p:tab title="Users"> 
         <p:button value = "Add user" outcome="addUser.xhtml?faces-redirect=true"/> 
         <p:growl id="messages" showDetail="true"/> 
         <p:dataTable id="usersTable" var="user" value="#{userMB.userList}" paginator="true" rows="25" 
            paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink}"> 
          <p:ajax event="rowEdit" listener="#{userMB.onEditUser}" /> 
          <p:column headerText="First name"> 
           <h:outputText value="#{user.firstName}" /> 
          </p:column> 
          <p:column headerText="Last name"> 
           <h:outputText value="#{user.lastName}" /> 
          </p:column> 
          <p:column headerText="E-mail"> 
           <h:outputText value="#{user.email}" /> 
          </p:column> 
          <p:column headerText="Username"> 
           <h:outputText value="#{user.username}"/> 
          </p:column> 
          <p:column headerText="Hire date"> 
           <h:outputText value="#{user.hireDate}"> 
            <f:convertDateTime type="date" pattern="dd.MM.yyyy"/> 
           </h:outputText> 
          </p:column> 
          <p:column headerText="Working hours"> 
           <h:outputText value="#{user.workingHours}" /> 
          </p:column> 
          <p:column headerText="Vacation days"> 
           <h:outputText value="#{user.vacationDays}"/> 
          </p:column> 

          <p:column> 
           <h:link outcome="addUser" value="Edit"> 
            <f:param name="userID" value="#{user.id}" /> 
           </h:link> 
          </p:column> 
          <p:column> 
           <p:commandLink value="Delete" onclick="deleteConfirmDlg.show()"> 
            <f:setPropertyActionListener value="#{user}" target="#{userMB.currentUser}" /> 
           </p:commandLink> 
          </p:column>        
         </p:dataTable> 

         <p:confirmDialog id="deleteConfirmDialog" message="Are you sure?" header="Delete user" severity="alert" widgetVar="deleteConfirmDlg" appendToBody="true"> 
          <p:commandButton id="confirmDelete" value="Yes" oncomplete="deleteConfirmDlg.hide()" update="usersTable" actionListener="#{userMB.deleteUser}"/> 
          <p:commandButton id="declineDelete" value="No" onclick="deleteConfirmDlg.hide()" type="button"/> 
         </p:confirmDialog> 
        </p:tab> 
        <p:tab title="Teams"> 
         <p:button value = "Add team" outcome="addTeam.xhtml?faces-redirect=true"/> 
         <p:dataTable var="team" value="#{userMB.teamList}" paginator="true" rows="25" 
          paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink}"> 
          <p:column headerText="Name"> 
           <h:outputText value="#{team.name}" /> 
          </p:column> 
          <p:column headerText="Team leader"> 
           <h:outputText value="#{team.teamLeader.displayName}" /> 
          </p:column> 
         </p:dataTable> 
        </p:tab> 
       </p:tabView> 
      </h:form> 
    </p:layoutUnit> 
    </ui:define> 
</ui:composition> 

Backing metodo di fagioli:

public void deleteUser(ActionEvent event) { 
    if (null != currentUser) { 
     // check if userID is set and delete 
     System.out.println("delete user with id " + currentUser.getId()); 
     userService.deleteUser(currentUser); 
     currentUser = new User(); 
    } 
} 

ho controllato e non ho nidificati forme in quanto questo è il caso più usuale per la backing bean not be called ...

Ecco il mio file template es:

CommonLayout.xhtml

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" 
xmlns:h="http://java.sun.com/jsf/html" 
xmlns:f="http://java.sun.com/jsf/core" 
xmlns:ui="http://java.sun.com/jsf/facelets" 
xmlns:p="http://primefaces.org/ui"> 
<h:head> 
<h:outputStylesheet library="css" name="default.css" /> 
</h:head> 
<h:body> 
<p:layout fullPage="true"> 
<div id ="header"> 
<ui:insert name="header"> 
    <ui:include src="commonHeader.xhtml"></ui:include> 
</ui:insert> 
</div> 
<div id="left-menu"> 
<ui:insert name="left-menu"> 
    <ui:include src="leftMenu.xhtml"></ui:include> 
</ui:insert> 
</div> 
<div id ="content"> 
<ui:insert name="content"> 
    <ui:include src="commonContent.xhtml"></ui:include> 
</ui:insert> 
</div> 
</p:layout> 
</h:body> 
</html> 

CommonHeader.xhtml:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:p="http://primefaces.org/ui"> 
<h:head> 
</h:head> 
<h:body> 
    <ui:composition> 
     <p:layoutUnit position="north" size="100"> 
      <h:outputText value="Welcome #{request.remoteUser}!"/> <br /> 
      <a href="#{request.contextPath}/j_spring_security_logout">Logout</a><br /> 
     </p:layoutUnit> 
    </ui:composition> 
</h:body> 
</html> 

CommonContent.xhtml:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:p="http://primefaces.org/ui"> 
<h:head> 
</h:head> 
<h:body> 
    <ui:composition> 
     <p:layoutUnit position="center"> 
       <ui:include src="../widgets/schedule.xhtml"/> 
     </p:layoutUnit> 
    </ui:composition> 
</h:body> 
</html> 

LeftMenu.xhtml:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:p="http://primefaces.org/ui"> 
<h:head> 
</h:head> 
<h:body> 
    <ui:composition> 
     <p:layoutUnit position="west" size="200"> 
     <h:form> 
      <p:menu width="100%" rendered="#{request.isUserInRole('ROLE_MANAGER')}"> 
       <p:submenu label="Management"> 
        <p:menuitem value="Manage users" outcome="/pages/management/manageUsers.xhtml?faces-redirect=true"></p:menuitem> 
       </p:submenu> 
      </p:menu> 
      </h:form> 
    </p:layoutUnit> 
    </ui:composition> 
</h:body> 
</html> 

Sto usando primefaces 3.4 e JSF 2.0

+2

Mi dispiace, ma non ho nemmeno letto l'intero post. È veramente necessario tutto questo codice/testo? Saluti! – SimonSez

+1

C'è davvero molto rumore nel codice (prova a minimizzarlo nelle domande future), ma fortunatamente il sintomo descritto è stato sufficiente a capire/indovinare la causa del problema senza mai guardare il codice :) – BalusC

+0

Scusa, volevo includi anche i miei file modello per essere sicuro che non ci fossero altri moduli annidati da qualche parte. – AndaP

risposta

19

Il <p:confirmDialog ... appendToBody="true"> causerà la rappresentazione HTML della finestra di dialogo di conferma per essere trasferito alla fine del HTML <body> elemento da JavaScript durante il DOM pronto.

Ciò tuttavia causa che la rappresentazione HTML della finestra di conferma non è più in alcun modulo. In modo così efficace non è stato inviato alcun modulo e non sono stati inviati parametri di richiesta e quindi JSF non sarà in grado di identificare l'azione.

È necessario fornire la finestra di conferma proprio <h:form>.

<p:confirmDialog ...> 
    <h:form> 
     ... 
    </h:form> 
</p:confirmDialog> 

E per evitare confusione durante la manutenzione (moduli estraibili è cioè illegale), ho anche suggeriscono di spostare tale componente fine di template, almeno dopo il "esterno" <h:form>.

+0

Ho spostato la finestra di dialogo dopo il modulo, ma sfortunatamente questo aggiornamento = ": datatable: usersTable" non funziona come componente non trovato. Ho pensato che questo fosse il modo di riferirsi a un componente al di fuori del modulo. – AndaP

+0

Il '' è anche un contenitore di nomi. Dagli un ID fisso come "" e usa 'update =": datatable: tabs: usersTable "'. Vedi anche http://stackoverflow.com/questions/8634156/how-to-reference-components-in-jsf-ajax-cannot-find-component-with-identifier/8644762#8644762 – BalusC

+0

Aggiunto un ID anche allo e ora funziona. Molte grazie! – AndaP

Problemi correlati