【问题标题】:JSF2: Form ajax action makes another form's view state to be lostJSF2:表单 ajax 操作使另一个表单的视图状态丢失
【发布时间】:2012-06-22 21:27:06
【问题描述】:

我有一个包含两个表单的简单页面。它们不能同时显示(一个切换另一个)。代码如下:

<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() 只是切换 rendered 属性中使用的布尔值。

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

我看到this 问题和this 链接,如您所见,我在render 属性中添加了表单ID,但它仍然不起作用。有什么想法吗?

谢谢

【问题讨论】:

  • #{newPoll2} 是一个视图范围的 bean,对吧?
  • 会话范围实际上。我附加了一个调试器,只有在执行第二次单击时才会调用我的方法。
  • 好的,您确定不是在提交期间实际评估了false 的父&lt;h:form&gt;rendered 属性吗?如果这不是问题,请尝试在&lt;h:form&gt; 内创建另一个&lt;h:panelGroup&gt;,并将rendered 属性移到那里。
  • @BalusC,你是神!添加另一个&lt;h:panelGroup&gt; 有帮助。这是工作代码:pastebin.com/cE5GDZ8e。只需确保添加官方答案,这样您就可以享受积分:)

标签: ajax forms jsf jsf-2 viewstate


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2017-11-16
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多