【问题标题】:How do I restore ViewState when using richfaces fileUpload?使用richfaces fileUpload时如何恢复ViewState?
【发布时间】:2013-03-31 21:53:00
【问题描述】:

我在提交包含两个表单的模板时遇到问题,其中<h:form>s 之一是multipart/form-data(即,用于通过Richfaces4 的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 here 发布的解决方法 javascript sn-p 可恢复 ViewState 并使表单正确提交。所以也许有人可以解释为什么在这种情况下显式重新渲染是不够的?

【问题讨论】:

    标签: file-upload jsf-2 richfaces


    【解决方案1】:

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

    关于您的编辑:我也尝试过从 BalusC 截取的内容,但它不再适用于 RichFaces 组件。所以我尝试了一种稍微不同的方法,发布在here。也许你可以看看它。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-16
      • 2023-03-07
      • 1970-01-01
      相关资源
      最近更新 更多