0

我在提交包含两种形式的模板时遇到问题,其中一个<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 并使表单正确提交。所以也许有人可以解释为什么在这种情况下显式重新渲染是不够的?

4

1 回答 1

0

我认为问题在于 RichFaces 组件会重新呈现表单:我制作了一个小测试页,在其中观察到与其他 RF 4 组件(如 a4j:commandButton)相同的情况。“重新呈现表单”的解决方法只有在 f:ajax 完成时才有效。

关于您的编辑:我也尝试了 BalusC 的剪辑,但它不再与 RichFaces 组件一起使用。所以我尝试了一种稍微不同的方法,这里发布了。也许你可以看看它。

如那里所写,我不能 100% 确定这是否是适用于所有情况的正确解决方案,但目前这对我有用。

于 2014-04-11T09:13:27.193 回答