0

<h:form>の 1 つがmultipart/form-data(つまり、Richfaces4 の を介してファイルを送信するために使用される)である 2 つのフォームのテンプレートを送信する際に問題が発生しています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 が返され、十分に true が返されます。フォームは なしで送信されjavax.faces.ViewStateます。

ViewState が失われるのは JSF のバグであり、フォームを明示的に再レン​​ダリングして状態を復元する必要があることは承知しています。しかし、これは私がすでにやっていることです。

では、これは Richfaces のバグですか?

追加するように編集:ここに BalusC によって投稿された回避策の JavaScript スニペットを追加すると、ViewState が復元され、フォームが正しく送信されます。この場合、明示的な再レンダリングが十分でない理由を誰かが明らかにできるでしょうか?

4

1 に答える 1

0

問題は、RichFaces コンポーネントがフォームの再レンダリングを行うことだと思います。小さなテストページを作成し、他の RF 4 コンポーネント (a4j:commandButton など) で同じことを観察しました。「フォームを再レンダリングする」回避策は、これが f:ajax によって行われる場合にのみ機能します。

あなたの編集に関して: 私も BalusC から切り取ったものを試しましたが、RichFaces コンポーネントでは再び動作しませんでした。そこで、ここに投稿されている少し異なるアプローチを試みました。たぶん、あなたはそれを見てみることができます。

そこに書かれているように、これがすべてのケースで正しい解決策であるかどうかは 100% わかりませんが、現時点ではこれでうまくいきます。

于 2014-04-11T09:13:27.193 に答える