将参数传递给与PrimeFaces对话框框架对话框关联的bean

时间:2017-08-31 16:04:46

标签: jsf primefaces parameter-passing dialog-framework

我有一个带按钮的模板,可打开对话框:

<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>

模板的后台bean(userAdministrationView)是@ViewScoped。

我想将参数selectedUser传递给对话框。是否可以使用Faces.setContext / Request / FlashAttribute,如adviced here?我尝试实现它:

public void openUserRolesDialogWithParameters() {
    Faces.setContextAttribute("user", selectedUser);
    dialogHandler.openDialog("user-roles-dialog");
}

并在对话框中支持bean(也是@ViewScoped):

@PostConstruct
public void init() {
    this.user = Faces.getContextAttribute("user");
    ...
}

但我在null获得了user。与setRequestAttribute和setFlashAttribute相同的结果。

Here建议使用属性创建@SessionScoped bean,但这个决定对我来说并不是很重要。这是唯一的方法吗?

1 个答案:

答案 0 :(得分:0)

感谢BalusC,我开始向正确的方向搜索,我找到了this explanation。 所以,它的工作原理如下:

模板支持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");
    ...
}