h:表单呈现正确,但h:commandLink无法正确呈现。我必须在链接上单击两次

时间:2013-03-22 22:09:47

标签: jsf-2 facelets render

我知道这个问题一遍又一遍地问。我确实对所有与此有关的问题提出了建议,我在this question that I put

中做了BalusC

告诉我,我还没有成功。 所以Web应用程序的流程是:

我登录,成功时boolean loggedIn变为true,页面被重定向到home.xhtml。 (Bean TestBean和EnterView被实例化并且SessionScoped)。在这个页面中,如果loggedIn布尔值为真,我有4个链接。

不使用JSTL c:选择标签(因为JSTL和JSF“在视图构建期间运行,另一个在视图渲染时运行。” - BalusC)我使用了渲染属性。

显示带有链接的列表,但我必须单击它们两次以执行应该执行的操作。

摘录:

        <h:form rendered="#{enterView.userBean.loggedIn}">
            <ul id="grileList">
                <li><h:commandLink action="#{menuView.showTestsPage(1)}"
                        value="label1" rendered="#{enterView.userBean.loggedIn}"/></li>
                <li><h:commandLink action="#{menuView.showTestsPage(2)}"
                        value="label2" rendered="#{enterView.userBean.loggedIn}"/></li>
                <li><h:commandLink action="#{menuView.showTestsPage(3)}"
                        value="label3"  rendered="#{enterView.userBean.loggedIn}"/></li>
                <li><h:commandLink action="#{menView.showTestsPage(4)}"
                        value="label4" rendered="#{enterView.userBean.loggedIn}"/></li>
            </ul>
        </h:form>

h:表单正确呈现,因此它已经完成了视图呈现阶段,但是当我单击链接时(当我单击它们两次时)它不会执行操作,所以它是视图构建时间吗? ??我读到了他们两个,我以为我明白了......

我已将render属性放在commandLinks中以尝试渲染它们,但我没有成功。

1 个答案:

答案 0 :(得分:3)

JSF spec issue 790的结果可以识别“需要点击两次才能调用动作”的症状,这在即将到来的JSF 2.2中得到修复。

到目前为止,如果你有两个表单,而另一个表单只通过ajax更新另一个表单的父组件,那么另一个表单将失去其JSF视图状态(<input type="hidden" name="javax.faces.ViewState">)。首次以其他形式调用ajax操作不会调用任何操作,但会重新添加JSF视图状态,然后任何后续操作都会成功。

要解决此问题,您需要在ajax渲染中显式指定其他表单的客户端ID。 E.g。

<f:ajax ... render=":someComponent :otherForm" />
...

<h:someComponent id="someComponent">
    <h:form id="otherForm" rendered="#{enterView.userBean.loggedIn}">
        ...

另见: