我有一个用户列表页面,该页面将用户保存在p:dataTable
中,并且每行中都有一个显示p:dialog
弹出窗口的更新按钮。
页面和对话框在视图范围内管理(在Spring中实现)。
当我按下主页面中的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>
这是p:对话框代码:
<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 && 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 :(得分:0)
我要做的第一件事就是确保调用方法selectionListener
(要么在其上放置一个断点,要么打印一些内容并稍后在控制台中检查)。
如果是,则必须检查变量customersList
是否正确更新,如果不正确,则可能存在bean范围问题。
在您的示例代码中,您不清楚如何设置辅助bean的范围,因此我假设您在Spring的XML配置文件中执行此操作。
通过检查视图中的内容,确保视图范围内确实有支持bean:FacesContext.getCurrentInstance().getViewRoot().getViewMap()
。
希望它有所帮助!
答案 1 :(得分:0)
这是一个老问题,但我最近也遇到过这个问题,现在又无奈了。我们来看看p:pickList:
<td>
<p:pickList id="customersList" iconOnly="true"
value="#{addEditUserController.customersList}" var="customer"
itemValue="#{customer.value}" itemLabel="#{customer.label}"/>
</td>
我们知道[var =“customer”]是一个迭代器,但是当验证错误发生时,这个var被分配给String类型,这是奇怪的。当您关闭此弹出窗口然后再次重新填充它时,您将收到错误消息,如下所示:对于String类型没有属性标签(值)... customer var现在是一个String,因此它没有值也没有标签属性。
现在,我使用一种棘手的方法,它总是不会有效,这取决于你的代码: 假设值和标签是唯一的,设置CustomersList类型的List String,customersList绑定标签,在后端提交时找到标签的值;为什么这种方式可以避免重新填充异常,这是因为迭代器始终是String的类型,无论是否发生验证错误。
希望这有助于满足需求。