我在提交双表单模板时遇到问题,其中<h:form>
之一是multipart/form-data
(即用于通过Richfaces4的rich:fileUpload
提交文件)。< / p>
基本模板如下所示:
<h:form enctype="multipart/form-data">
<rich:fileUpload fileUploadListener="#{uploader.doUpload}" execute="@form" render="@form :inputForm" />
</h:form>
<h:form id="inputForm">
<h:inputText value="#{uploader.input1}" />
<h:commandButton action="#{uploader.save}" value="Save" />
</h:form>
此模板还有一个page.xml,它调用一个动作:
<action execute="#{uploader.selectObjectsFromRequest}" on-postback="false" />
我的问题是当我点击“保存”按钮时selectObjectsFromRequest
不断被调用。
调试此项,FacesContext.getCurrentInstance().isPostback()
在这种情况下返回false,并且足够真实,表单是在没有javax.faces.ViewState
的情况下提交的。
我知道丢失ViewState是一个JSF错误,我们应该明确地重新渲染表单以恢复其状态。但这就是我现在所做的。
那么,这是Richfaces中的一个错误吗?
编辑添加:添加BalusC here发布的解决方法javascript片段可恢复ViewState并使表单正确提交。那么也许有人可以阐明为什么在这种情况下显式重新渲染是不够的呢?
答案 0 :(得分:0)
我认为问题在于RichFaces组件重新渲染表单:我做了一个小测试页面,我在其中观察到与其他RF 4组件相同(例如a4j:commandButton)。 “重新呈现表单” - 只有在f:ajax完成时才会起作用。
关于你的编辑:我也尝试过从BalusC剪下来的,但是它再次没有使用RichFaces组件。所以我尝试了一种稍微不同的方法,即here。也许你可以看看它。
正如那里写的那样,我不能100%确定这是否适用于所有情况,但目前这对我有效。