2012-06-03 20 views
0

我有一個用戶列表頁面,其中包含p:dataTable中的用戶並且在每一行中我有一個更新按鈕顯示一個p:dialog彈出窗口。 頁面,在對話框中的視圖範圍內(在Spring中實現)進行管理。p:pickList按下後沒有取數據p:commandButton

當我按下editUserButton在主要頁面的彈出窗口的所有數據,然後我鍵入一個無效的字符串到田間電子郵件用戶名。出現驗證消息,但選項列表中沒有填充任何值。

可能是什麼問題?

這是最主要的頁面(用戶列表)代碼片段:

<ui:composition> 
<f:view id="bodyView"> 
    <div id="content_body"> 
     <ui:include src="editUserDialog.xhtml"/> 
     <h:form id="usersListForm"> 
     <table width="85%" align="center"> 
      <tr> 
       <td> 
        <p:dataTable id="usersList" var="user" 
          value="#{usersController.usersList}" 
          selectionMode="single" 
          rowKey="#{user.userId}"> 
         <p:columnGroup type="header"> 
          <p:row> 
           ... 
           <p:column rowspan="2" headerText="Users"/> 
           ... 
          </p:row> 
         </p:columnGroup> 
          ... 
         <p:column id="users" > 
          <p:commandLink id="editUserButton" oncomplete="addEditUserConfirmation.show()" actionListener="#{addEditUserController.selectionListener}" 
            update=":addEditCustomerDialogForm:dialogContent"> 
            <f:attribute value="#{user}" name="selectedUser" /> 
          </p:commandLink> 
         </p:column> 
        </p:dataTable> 
       </td> 
      </tr> 
     </table> 
     <br/> 
     </h:form> 
    </div> 
</f:view> 

這是號碼:對話框代碼:

<ui:composition> 
<h:form id="addEditUserDialogForm"> 
     <p:dialog id="addEditUserDialog" severity="alert" widgetVar="addEditUserConfirmation" draggable="true" modal="true" 
       resizable="false" > 
     <p:outputPanel id="dialogContent"> 
     <div> 
      <table cellpadding="5"> 
       <tr> 
        <td> 
         <p:inputText value="#{addEditUserController.addEditCustomerBean.userName}" 
           maxlength="250" size="50" label="user name" id="userName"> 
          <f:validator validatorId="UsernameValidator"/> 
         </p:inputText> 
         <p:message for="userName"/> 
        </td> 
       </tr> 
       <tr> 
        <td> 
         <p:inputText value="#{addEditUserController.addEditCustomerBean.email}" 
           maxlength="50" size="50" label="E-mail" id="email"> 
          <f:validator validatorId="EmailValidator"/> 
         </p:inputText> 
         <p:message for="email"/> 
        </td> 
       </tr> 
      </table> 
      <table cellpadding="5"> 
       <tr> 
        <td> 
         <p:pickList id="customersList" iconOnly="true" 
            value="#{addEditUserController.customersList}" var="customer" 
            itemValue="#{customer.value}" itemLabel="#{customer.label}"/> 
        </td> 
       </tr> 
      </table> 
     </div> 
     <div align="right"> 
      <p:commandButton value="#{isNewUser ? 'add' : 'update'}" id="updateUserButton" 
             actionListener="#{addEditUserController.persistUser}" 
             update="dialogContent" 
             styleClass="fiftyone-default-button" 
           oncomplete="handleRequest(xhr, status, args)"/> 
     </div> 
     </p:outputPanel> 
</p:dialog> 
</h:form> 
<script type="text/javascript"> 
    function handleRequest(xhr, status, args) { 
     if(!(args.validationFailed &amp;&amp; args.validationFailed == true)) { 
      addEditUserConfirmation.hide(); 
     } 
    } 
</script> 

這是支持bean代碼:

import org.primefaces.model.DualListModel; 
import javax.annotation.PostConstruct; 
import javax.faces.event.ActionEvent; 
import java.util.List; 

public class AddEditUserController { 
    private AddEditCustomerBean addEditCustomerBean; 
    private DualListModel<LabelValueBean> customersList; 

    // ... constructor getters and setters 

    public void selectionListener(ActionEvent event) throws Exception { 
     selectedUser = event.getComponent().getAttributes().get("selectedUser"); 
     // some code 
     AddEditCustomerBean = new AddEditCustomerBean(); 
     // some code 
     customersList = getSomeCustomersDualListModel() 
    } 

    public void persistUser() throws Exception { 
     // save user to DB 
    } 
} 

回答

0

我首先要做的是確保該方法selectionListener被調用(要麼把一個破發點上或打印的東西和檢查稍後在控制檯中)。

如果是這樣,您必須檢查變量customersList是否正確更新,如果不是,您可能在使用bean範圍時遇到問題。

在您的示例代碼並不清楚你是如何設置的支持bean的範圍,所以我認爲你這樣做是對Spring的XML配置文件。

確保你真的在視圖範圍內支持bean,通過檢查查看地圖的內容:FacesContext.getCurrentInstance().getViewRoot().getViewMap()

希望它有幫助!

0

這是一個老問題,但我也遇到了這個問題,最近,現在是無奈。讓我們來看看號碼:選擇列表:

   <td> 
        <p:pickList id="customersList" iconOnly="true" 
           value="#{addEditUserController.customersList}" var="customer" 
           itemValue="#{customer.value}" itemLabel="#{customer.label}"/> 
       </td> 

我們知道的[VAR =「客戶」]是一個迭代器,但是當驗證錯誤發生時,這個變量被分配到字符串類型,它是奇怪。在String類型的無屬性標籤(值)......客戶VAR現在是一個字符串,所以它沒有價值,也不標籤:當您關閉這個彈出然後再重新填充它,你會得到一個錯誤,這樣的消息屬性。假設值和標籤是唯一的,設置customersList類型的List String,customersList綁定標籤,查找在後端提交時標籤的值;爲什麼這樣可以避免重新填充異常,這是因爲迭代器始終是String類型,無論是否發生驗證錯誤。

希望這可以幫助需要。

相關問題