我在提交包含两种形式的模板时遇到问题,其中一个<h:form>
s 是 a multipart/form-data
(即,用于通过 Richfaces4's 提交文件rich:fileUpload
)。
基本模板如下所示:
<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 发布的 Workaround javascript 片段可恢复 ViewState 并使表单正确提交。所以也许有人可以解释为什么在这种情况下显式重新渲染是不够的?