JSF2:表单ajax动作使另一个表单的视图状态丢失

时间:2012-06-22 21:27:07

标签: ajax forms jsf jsf-2 viewstate

我有一个由两种形式组成的简单页面。它们不能同时显示(一个切换另一个)。这是代码:

<h:body>

    <ui:composition template="/elements/templateWithMenu.xhtml">            
        <ui:define name="content">

            <p:dialog id="question1DialogId" widgetVar="question1Dialog" resizable="false" closable="false" visible="true">                             

                <h:panelGroup id="questionStep1Group">
                    <h:form id="questionStep1Form" rendered="#{newPoll2.displayQuestionStep1}">

                        <h:commandLink value="next" action="#{newPoll2.questionStep1Completed()}" class="btn" >
                            <f:ajax execute="@form" render=":questionStep2Form :questionStep1Group :questionStep2Group"/>
                        </h:commandLink>

                    </h:form>
                </h:panelGroup>

                <h:panelGroup id="questionStep2Group">
                    <h:form id="questionStep2Form"  rendered="#{newPoll2.displayQuestionStep2}">

                        <h:commandLink value="cancel" action="#{newPoll2.questionStep2Cancelled()}" class="btn" >
                            <f:ajax execute="@form" render=":questionStep1Form :questionStep1Group :questionStep2Group" />
                        </h:commandLink>

                    </h:form>
                </h:panelGroup>

            </p:dialog>

        </ui:define>
    </ui:composition>

</h:body>

questionStep1Completed() questionStep2Cancelled()只需切换呈现的属性中使用的布尔值。

问题在于视图状态。首次加载页面时,单击“下一步”将起作用,它将被替换为“取消”链接。但是当我点击“取消”链接时,需要点击两次才能将其替换为“下一个”链接。我可以看到第一次单击使请求没有视图状态,第二次(成功)请求使用它。

我看到了this个问题和this链接,正如您所看到的,我在呈现属性中添加了表单ID,但它仍然没有工作。有什么想法吗?

由于

1 个答案:

答案 0 :(得分:2)

您有条件地呈现表单本身,因此在准备ajax请求时,HTML DOM树中的其他表单在物理上不可用。如果您将表单的内容包装在另一个<h:panelGroup>中并将rendered属性移到那里,那么它应该可以正常工作。