2013-01-11 22 views
8

私はPrimeFacesデータテーブルを持っていて、各行で削除するcommandLinkを持つユーザーのセットを表示しています。リンクがクリックされると、confirmDialogが表示され、バッキングBeanの「delete」メソッドを呼び出す必要がある「Yes」ボタンが表示されます。残念ながら、このメソッドは呼び出されず、ダイアログは単に隠されています。リンクからのパラメータは、デバッガで見たので設定されています。confirmDialogのPrimeFaces commandButtonがバッキングBeanを呼び出さない

<?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> 

バッキングBeanのメソッド::ここで

は私のページです

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(); 
    } 
} 

私がチェックし、これがための最も一般的なケースであるように私は、フォームを入れ子になっていませんバッキングビーンが呼び出されていない...

私のテンプレートfil 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> 

私はPrimeFaces 3.4とJSFを使用しています2.0

+2

申し訳ありませんが、あなたの投稿全体を読むことさえできませんでした。このコード/テキストはすべて本当に必要ですか?乾杯! – SimonSez

+1

実際には多くのコードノイズがあります(将来の質問でそれを最小限に抑えようとしています)。しかし幸いにも、記述された症状は、コードを見ずに問題の原因を理解/推測するのに十分なものでした:) – BalusC

+0

私のテンプレートファイルも含まれていて、そこに他のネストされたフォームがないことを確かめてください。 – AndaP

答えて

19

<p:confirmDialog ... appendToBody="true">確認ダイアログのHTML表現は、DOMの間にはJavaScriptによってHTML <body>要素の末尾に移転されることになります準備ができました。

これにより、確認ダイアログのHTML表現は、もはや任意のフォームに含まれなくなります。したがって、フォームは送信されず、リクエストパラメータも送信されないため、JSFはアクションを識別できません。

確認ダイアログに独自の<h:form>を付ける必要があります。

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

やメンテナンス時の混乱を避けるために(入れ子の形式はつまり違法です)、私はまた、テンプレートの最後に少なくとも後の「外側」<h:form>をそのコンポーネントを移動することをお勧めします。

+0

フォームの後にダイアログを移動しましたが、残念ながらこのアップデート= ":datatable:usersTable"はコンポーネントが見つからないため動作しません。私はこれがフォーム外のコンポーネントを参照する方法だと思っていました。 – AndaP

+0

」は名前付け用のコンテナでもあります。 ''のような固定IDを与え、 'update =":datatable:tabs:usersTable "を使用します。 http://stackoverflow.com/questions/8634156/how-to-reference-components-in-jsf-ajax-cannot-find-component-with-identifier/8644762#8644762 – BalusC

+0

にもIDを追加しました。それは今働く。どうもありがとう! – AndaP

関連する問題