我刚开始学习JSF和PrimeFaces,一旦我解决问题(在你的帮助下),就会出现另一个问题。我有一个数据表显示有关我的应用程序用户的一些数据;在最后一列中,commandButton调用一个对话框,允许编辑相应的数据。该对话框实际上与支持bean交互,因为字段已使用现有数据正确预编译,但“提交更改”commandButton不会触发正确的editUser()
方法!
我到处搜索我的问题的解决方案,但PrimeFaces论坛上没有任何线程,也没有任何关于Stack Overflow的问题帮助了我:我尝试了action
,actionListener
的所有组合,内部<h:form>
,外部<h:form>
,甚至是可怕的嵌套<h:form>
,但仍未调用基础方法。
谢谢大家,人们!
编辑:我添加了一些xhtml。需要明确的是:在数据表中,我正在实现单选和多选机制。单个选择由最后一列中的editButton
执行,并触发给我带来痛苦的editDialog
,而第一列中的复选框启用多个选择,并由底部的commandButton定位删除所有选定用户的表格;当然,它们将选择存储在辅助bean中的不同字段中(分别为selectedUser
和selectedUsers[]
)。
xhtml文件
<h:form id="tableForm">
<p:dataTable id="userList" var="user" value="#{userListBean.userList}"
selection="#{userListBean.selectedUsers}" rowKey="#{user.username}">
<!-- this is a checkbox column I use for multiple selection -->
<p:column selectionMode="multiple" style="width:2%"/>
<!-- other datatable columns -->
<!-- this is the button column that triggers the dialog -->
<p:column style="width:4%">
<p:commandButton id="editButton" update=":tableForm:editUserData"
oncomplete="PF('editDialog').show()" title="Edit" icon="ui-icon-pencil">
<f:setPropertyActionListener target="#{userListBean.selectedUser}"
value="#{user}" />
</p:commandButton>
</p:column>
</p:datatable>
<p:dialog id="editDlg" widgetVar="editDialog" header="Edit User"
showEffect="fade" hideEffect="fade" modal="true" dynamic="true">
<h:panelGrid columns="6" id="editUserData">
<p:outputLabel for="editUsername">Username:</p:outputLabel>
<p:inputText disabled="true" id="editUsername" value="#{userListBean.selectedUser.username}" />
<p:message for="editUsername" />
<!-- and other fields like that -->
</h:panelGrid>
<p:commandButton id="submitChanges" action="#{userListBean.editUser()}"
value="Submit changes" oncomplete="PF('editDialog').hide();" />
</p:dialog>
</h:form>
支持bean
@ManagedBean(name="userListBean")
@ViewScoped
public class UserListBean {
private UserDTO selectedUser;
public UserListBean() {
}
//some methods...
public String editUser() {
System.out.println("------------------ EDIT TRIGGERED! -------------------");
System.out.println(selectedUser.getUsername());
//this stuff never gets printed, so the method is never called!
}
//getters and setters
}
答案 0 :(得分:2)
实际上,唯一没有出现在我脑海中的事实证明是有效的。 我通过使用三种形式来解决我的问题(正如我在我的问题中提到的,我已经尝试了一种和两种形式的所有可能组合,甚至是嵌套形式),如下所示:
<h:form id="tableForm">
<!-- here lies the p:dataTable -->
</h:form>
<p:dialog>
<h:form id="dialogForm">
<!-- here lies the h:panelGrid with the editable fields -->
</h:form>
<h:form id="buttonForm">
<!-- and HERE goes the commandButton, alone -->
</h:form>
</p:dialog>
看起来每个人都以不适合其他人的方式解决这个问题:)。