2016-12-27 83 views
1

我的問題的簡短版本是在我修改bean的值後,inputtext不會更改bean中的值。
更長的版本:
有一種形式是一個dataTable與用戶信息;一些inputTexts和兩個按鈕。如果填充inputTexts,將會使用給定的數據創建一個新用戶,並顯示在dataTable中 - 這很好,我可以創建儘可能多的用戶。
棘手的部分是,如果您從dataGrid中選擇一行,則用戶信息必須出現在inputText字段中 - 這很好 - 所以管理員可以修改它們。但是,在更改bean中的inputText值之後,如果管理員在inputText中更改了某個值,則值「不會跟隨」該更改,但值保持不變。我能做什麼錯?
JSF頁面看起來像這樣:jsf inputtext在更改bean後不更新值

<html> 
 
<h:body> 
 
    <h:form style="font-size:14px;" id="setupform"> 
 
    ... 
 
     <p:panel header="Edit users" id="userAddingPanel" rendered="#{settingsbean.validLogin}"> 
 
     <p:panelGrid columns="2" id="userAddingGrid"> 
 
      <p:outputLabel value="User Name: " /> 
 
      <p:inputText id="userName" value="#{settingsbean.userName}" /> 
 

 
      <p:outputLabel value="User Password: " /> 
 
      <p:password id="userPass" value="#{settingsbean.userPassword}" /> 
 

 
      <p:outputLabel value="E-mail address: " /> 
 
      <p:inputText id="userMailAddress" value="#{settingsbean.mailAddress}" /> 
 

 
      <p:outputLabel id="userDelete" value="Inactivate User: " /> 
 
      <p:selectBooleanCheckbox id="isUserDeleted" value="#{settingsbean.deletedUser}" /> 
 

 
      <p:commandButton id="addUser" value="Create User" update="userAddingGrid" icon="ui-icon-disk" action="#{settingsbean.addNewUser}" /> 
 

 
      <p:commandButton id="modifyUser" value="Modify User" icon="ui-icon-wrench" update="userAddingGrid" action="#{settingsbean.updateUser}" process="setupform"/> 
 

 
     </p:panelGrid> 
 

 
     <br/> 
 

 
     <p:dataTable id="usersTable" var="users" value="#{settingsbean.userList}" tableStyle="overflow: auto;" stickyHeader="true" selectionMode="single" rowKey="#{users.id}" selection="#{settingsbean.selectedUser}"> 
 

 
      <p:ajax event="rowSelect" update=":setupform:userName, :setupform:userName, 
 
       :setupform:userPass, :setupform:userMailAddress, :setupform:isUserDeleted" /> 
 

 
      <p:column headerText="#ID"> 
 
      <h:outputText value="#{users.id}" /> 
 
      </p:column> 
 

 
      <p:column headerText="Name"> 
 
      <h:outputText value="#{users.loginName}" /> 
 
      </p:column> 
 
      ... 
 
     </p:dataTable> 
 
     </p:panel> 
 
    </h:form> 
 
</h:body> 
 

 
</html>

我的豆是這樣的:

@ManagedBean(name ="settingsbean") 
@ViewScoped 
public class SettingsBean { 
private String userName; 
private String userPassword; 
private boolean deletedUser; 
private List<UserDTO> userList; 
private UserDTO selectedUser; 
/*with getters and setters, what is uncenventional is this setter*/ 
public void setSelectedUser(UserDTO selectedUser) { 
/*if admin selects/unselects a user from dataTable*/   
this.selectedUser = selectedUser; 
/*if unselect user*/ 
     if(selectedUser == null){ 
      userName = ""; 
      mailAddress = ""; 
      deletedUser = false; 
/*if selects user*/   
}else { 
      userName = selectedUser.getLoginName(); 
      mailAddress = selectedUser.getMailAddress(); 
      deletedUser = selectedUser.getDeleted(); 
     } 
    } 
... 
public void addNewUser(){ 
//creates a new user in DB 
} 

public void updateUser(){ 
//will update user in DB 
} 
} 
+0

嵌套形式ar不允許! (如果你想創建一個[mcve],你會發現它至少在你的問題中扮演角色)http://stackoverflow.com/questions/5665524/form-within-form-skip-validation-of-父母形式 – Kukeltje

+0

坦克你指出。我刪除了內部表單,HTML現在只包含一個表單。 – kukker

+0

我想強調的是,Kukeltje聲明不允許嵌套表單。如果您正在使用模板,請檢查您的父模板或當前頁面中是否有一個表單。這對我有效。 –

回答

0

你要處理要進行更新

組件
<p:commandButton id="modifyUser" value="Modify User" icon="ui-icon-wrench" update="userAddingGrid" action="#{settingsbean.updateUser}" process="userAddingGrid"/> 
+0

謝謝,但它似乎並沒有幫助。我也試圖處理這個表單,但徒勞無功。 – kukker

+0

這很少見。你在哪裏驗證值已更新?如果你在數據庫中這樣做,也許問題出在你的更新方法中,你確定在更新方法中使用它之前,你是否將userName,mailAddress和deletedUser重新分配給了selectedUser DTO? –

+0

我只是調試它。我在第一行調用了「創建用戶」調用的函數,並評估了userName,userPassword,...字段,所以我看到的是在DB之前或任何其他函數調用。它看起來像重新加載整個頁面後,解除或不會調用字段設置器方法。 – kukker