4

我想做的只是一个简单的注销功能。主页面会调用模板页面;由标题和内容组成。标题包含注销按钮。页面中有两种形式,一种在标题中(注销按钮),一种在内容中(几个按钮、链接等)。

我的问题是第一次单击注销链接时页面刷新,并且只有在第二次单击后才能继续。当我在内容表单中包含 primefaces 或 ajax 代码时,问题开始出现。当我删除该特定代码时,注销会按预期工作。

主模板中的注销表单templateUser.xhtml

<h:form id="logout">
    <h:commandLink action="#{tenantController.customLogout(e)}"
        id="logoutBtn" immediate="true" value="Logout" />
</h:form>

支持bean:

public String customLogout(ActionEvent e) {
    return "login.xhtml";
}

仅供参考:customLogout 方法也包含会话销毁,但我只是将页面重定向放在这里。

在模板客户端中,模板被指定为:

<ui:composition template="/templateUser.xhtml">

至于JSF库,目前使用jsf 2.0

我尝试过的解决方案:

  • immediate="true"
  • id为表单和commandLink(模板表单和内容表单)放置
  • 使用 primefaces ( <p:commandLink>with ajax false ==> this returb to the previous page; backed bean中的方法没有运行。

以下是我在这里尝试的几个链接:

4

1 回答 1

1

当我在内容表单中包含 primefaces 或 ajax 代码时,问题开始出现。当我删除该特定代码时,注销会按预期工作。

您的问题是由第 7 点引起的,如commandButton/commandLink/ajax action/listener method not invoked or input value not updated中所述。<f:ajax>当您使用并执行包含所有其他表单的更新来触发 ajax 请求时,所有其他表单都将失去其视图状态。这导致第一次提交将始终“什么都不做”,但下一次提交将起作用,这与您的问题症状完全匹配。

您可以通过以下方式之一解决此问题:

  1. <f:ajax render>. 您可以指定多个客户端 ID 以空格分隔。例如

    <f:ajax ... render="someComponent otherComponent :loginForm" />
    
  2. 使用此答案中提出的基于 JavaScript 的修复:h:commandButton/h:commandLink 在第一次单击时不起作用,仅在第二次单击时起作用

于 2012-12-05T11:56:29.090 回答