【发布时间】: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的父<h:form>的rendered属性吗?如果这不是问题,请尝试在<h:form>内创建另一个<h:panelGroup>,并将rendered属性移到那里。 -
@BalusC,你是神!添加另一个
<h:panelGroup>有帮助。这是工作代码:pastebin.com/cE5GDZ8e。只需确保添加官方答案,这样您就可以享受积分:)
标签: ajax forms jsf jsf-2 viewstate