我有一个带有打开对话框的按钮的模板:
<p:commandButton
id="roles-button"
icon="fa fa-key">
<f:setPropertyActionListener value="#{user}" target="#{userAdministrationView.selectedUser}" />
<f:actionListener binding="#{userAdministrationView.openUserRolesDialogWithParameters()}"/>
<p:ajax
event="dialogReturn"
listener="#{dialogHandler.showMessage}"
update=":user-administration-form:user-administration-table"
global="false"
/>
</p:commandButton>
back bean用于模板(userAdministrationview)已@viewscoped。
我想将参数selectedUser
传递到对话框。使用face.setContext/request/flashAttribute,是否可以像这里所建议的那样?我试图像:
public void openUserRolesDialogWithParameters() {
Faces.setContextAttribute("user", selectedUser);
dialogHandler.openDialog("user-roles-dialog");
}
和在对话框中支持bean(也是@viewscop的):
@PostConstruct
public void init() {
this.user = Faces.getContextAttribute("user");
...
}
但是我在user
中获得null
。相同的结果是用setRequestAttribute和setFlashattribute。
在这里建议创建具有属性的@SessionsCoped Bean,但是这个决定对我来说并不相关。这是唯一的方法吗?
多亏了balusc,我开始朝着正确的方向搜索,我找到了这种解释。因此,它是这样的工作:
模板备份bean:
public void openUserRolesDialogWithParameters() {
Map<String, Object> sessionMap = FacesContext.getCurrentInstance().getExternalContext().getSessionMap();
sessionMap.put("user", selectedUser);
dialogHandler.openDialog("user-roles-dialog", "contentWidth", "500");
}
对话框支持bean:
@PostConstruct
public void init() {
Map<String, Object> sessionMap = FacesContext.getCurrentInstance().getExternalContext().getSessionMap();
this.user = (UserModel) sessionMap.get("user");
sessionMap.remove("user");
...
}